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

发布于 2022-09-03 00:08:10 字数 147 浏览 37 评论 0

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

栩栩如生 2022-09-10 00:08:10

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

铜锣湾横着走 2022-09-10 00:08:10

@rozbo 的答案做下补充

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

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

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

  • “可写”的具体含义:

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

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

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

浊酒尽余欢 2022-09-10 00:08:10

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文