修改堆上的信息,程序会异常终止吗
int *array = (int*)malloc(sizeof(int));
int i = 0;
for( i = 0; i < 6; i++ )
array[i] = i;
这种会导致程序异常终止么
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
int *array = (int*)malloc(sizeof(int));
int i = 0;
for( i = 0; i < 6; i++ )
array[i] = i;
这种会导致程序异常终止么
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(3)
不一定,要看你多写入的两个字节是否可写,如果不可写会崩溃,如果可写,要看写入后有没有破坏程序其他地方正在运行的逻辑。
为 @rozbo 的答案做下补充
“不可写”的具体含义:
在 Linux 中,每一个运行的进程会被划分好固定的内存区域作为堆。
这个区域的尺寸要大等于程序的 .bss 和 .data 数据段(用来存储全局变量)。
如果通过 malloc 获得的指针很不巧,贴着堆的边缘,
那么对指针越界操作就会越过堆边界,
这时 Java虚拟机 或者 Linux Kernel 就会阻止程序的越界操作,
以免Bug/恶意程序影响其他程序的正常运行,
而越界的程序也会异常中止。
“可写”的具体含义:
就是恰巧指针越界后还在本程序的堆空间以内。
虽然不一定会直接导致程序异常并终止,
也有很大风险会意外覆盖程序别的数据段,
并遗留下非常难除错的Bug。
所以不推荐这样写。
提问中代码似乎明确要遍历数组的6个元素,
可否在 malloc 的时候就直接申请6个int的尺寸?
如果想检测程序的内存风险:
可以用 valgrind 作为壳,来测试程序的运行。
检测到内存风险会给出详细完整的 function call trace, 方便除错。
分配了一个int的空间却用0-5不出问题才怪