为什么在 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] = '#';

为什么不报错?

3829 次点击
所在节点    程序员
28 条回复
Monad
2015-06-15 15:08:16 +08:00
不报错从标准上来说应该是undefined behaviour
从实际上来说 是因为ptmalloc2(或者其它memory allocator)会Round Up你malloc的大小,所以你写入的区域实际上是属已经向OS申请的内存区域,而不是OS禁止写入的区域(那样会segmentation fault)
nicai000
2015-06-15 15:09:19 +08:00
算越界, 不检查不警告, 就这么设计的
tabris17
2015-06-15 15:12:11 +08:00
C的数组是不安全的类型,所谓不安全的类型就是语言本身不会越界检查
xylophone21
2015-06-15 15:12:23 +08:00
因为这样可以写出
char *result = (char*)0x12345678;
这样的代码
leavic
2015-06-15 15:14:56 +08:00
底层语言变态的地方就是可以让你访问任意地址,而且很轻松
xionghengheng
2015-06-15 15:20:28 +08:00
看看malloc的源码你就懂了,谁说堆内存malloc一次就是按照申请多少就给你多少,他可能会给你比你申请内存多一点,这都是内存的动态管理
ChanneW
2015-06-15 15:28:13 +08:00
再加多少都不算越界
wy315700
2015-06-15 15:30:30 +08:00
还可以访问 result[-1]
abscon
2015-06-15 15:46:43 +08:00
说一句跑题的话:index 这个变量在哪里定义的?楼主你这段代码编译通过了吗?
zmj1316
2015-06-15 16:27:51 +08:00
@abscon 我以为就我一个呢 亏我还仔细找了。。。
dddd
2015-06-15 17:34:54 +08:00
@abscon 额…… index = 3
yangff
2015-06-15 17:37:40 +08:00
你可以操作任何一个属于你的地址.
sleeperqp
2015-06-15 17:47:47 +08:00
不能说是任意地址 只能说是该程序的线性地址
loveuqian
2015-06-15 17:49:41 +08:00
因为越界不报错啊
zhicheng
2015-06-15 17:55:04 +08:00
谁丫的知道你 index 是啥值。
icedx
2015-06-15 18:46:57 +08:00
C 语言哪有越界一说
想去哪就去哪
21grams
2015-06-15 18:53:21 +08:00
那你说说由谁来报这个错呢?
zhangxiao
2015-06-15 19:09:44 +08:00
这就好比一条街上每隔10米一户人家,一共3户(0,1,2)。
写个简单的机器人发,就告诉机器人在n*10的地方丢下包裹就好了。所以你硬要是发给#3,那就丢在了30米的地方,硬要发给#10,就丢在了100米的地方,机器人不管那里有没有住户。
如果让楼主自己去发,你一看就会说,这条街上没有#3啊,就报错了
thinkIn
2015-06-15 20:00:35 +08:00
虽然越界不会报错,但一定不要做这种事,很可能会覆盖掉malloc与free维护的链表节点头信息,这将会是致命错误。
zi
2015-06-15 20:57:11 +08:00
C语言的数组名其实是个指针来的,既然是指针,那就可以随便指随便写,至于你随便写之后覆盖掉什么东西。。后果自负。。

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

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

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

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

© 2021 V2EX