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

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

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

阅读 3.6k
3 个回答

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

@rozbo 的答案做下补充

  • “不可写”的具体含义:

在 Linux 中,每一个运行的进程会被划分好固定的内存区域作为堆。
这个区域的尺寸要大等于程序的 .bss 和 .data 数据段(用来存储全局变量)。

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

  • “可写”的具体含义:

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

  • 如果想检测程序的内存风险:

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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题