为什么在 C 语言里面动态分配的空间被填满之后再加一个字符不算越界?

2015-06-15 15:00:36 +08:00
 dddd

代码如下:

int i;
char *result = (char*)malloc(3*sizeof(char));
memset(result, 0, 3*sizeof(char));
for (i = 0; i < 3; i++) {
    result[i] = 'a';
}
result[index] = '#';

为什么不报错?

3842 次点击
所在节点    程序员
28 条回复
mintist
2015-06-15 22:35:54 +08:00
给你自由,自己把握
way2exluren
2015-06-15 22:41:50 +08:00
加句free(result );应该会崩溃
yaoc
2015-06-16 00:10:42 +08:00
@way2exluren
应该不会,因为result指向的还是一开始分配给它的内存
way2exluren
2015-06-16 00:12:52 +08:00
@yaoc 你去试试。。。。
way2exluren
2015-06-16 00:14:36 +08:00
@yaoc 分配好的内存前后都有几个自己是用来管理内存的。覆盖了以后,free再重新整理内存快的时候会出错。。
yaoc
2015-06-16 00:31:36 +08:00
@way2exluren 我试了,没有什么问题
alphonsez
2015-06-16 01:43:22 +08:00
试试看多越界一点,估计就出问题了。这种问题会藏的很深,到时候真崩溃了很难找。一个字节的这种,搞不好还能来个heartbleed.
Heartwork
2015-06-16 09:01:38 +08:00
1 因为malloc在分配的内存是16字节补齐的。所以就算你访问了后面的几个字节,也还是在有效内存范围内。

2 即使你访问了多于16字节的非法空间,还是需要根据brk或sbrk查看数据段末端的地址,如果超过这个值,就会有内存访问异常了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/198690

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX