首页 > 修改堆上的信息,程序会异常终止吗

修改堆上的信息,程序会异常终止吗

int *array = (int*)malloc(sizeof(int));
    
int i = 0;
for( i = 0; i < 6; i++ )
    array[i] = i;

这种会导致程序异常终止么


不一定,要看你多写入的两个字节是否可写,如果不可写会崩溃,如果可写,要看写入后有没有破坏程序其他地方正在运行的逻辑。


分配了一个int的空间却用0-5不出问题才怪


为 @rozbo 的答案做下补充

在 Linux 中,每一个运行的进程会被划分好用来存储全局变量)。

如果通过 malloc 获得的指针很不巧,贴着堆的边缘,
那么对指针越界操作就会越过堆边界,
这时 Java虚拟机 或者 Linux Kernel 就会阻止程序的越界操作,
以免Bug/恶意程序影响其他程序的正常运行,
而越界的程序也会异常中止。

就是恰巧指针越界后还在本程序的堆空间以内。
虽然不一定会直接导致程序异常并终止,
也有很大风险会意外覆盖程序别的数据段,
并遗留下非常难除错的Bug。
所以不推荐这样写。
提问中代码似乎明确要遍历数组的6个元素,
可否在 malloc 的时候就直接申请6个int的尺寸?

可以用 valgrind 作为壳,来测试程序的运行。
检测到内存风险会给出详细完整的 function call trace, 方便除错。

【热门文章】
【热门文章】