我会不时出现如下错误:
unsigned int* x = calloc(2000, sizeof(unsigned int));
printf("%d", x[2000]);
我已经超出了已分配区域的末尾,因此我在运行时获得了一个EXC_BAD_ACCESS信号。我的问题是:这是如何被发现的?看起来这只会默默地返回垃圾,因为我只关闭了一个字节,而不是整页。系统的哪个部分阻止我只返回x + 2000
处的垃圾字节?
答案 0 :(得分:1)
内存系统在其内存字段的开头和结尾都有标记值,超出了分配的字节数。释放内存时,它会检查这些值是否完好无损。如果没有,它告诉你。
答案 1 :(得分:0)
也许你很幸运,因为你使用2000
作为一个大小。根据{{1}}的大小,总大小可以被int
或32
整除,因此很有可能它的结尾真正终止了“真正的”分配。尝试使用奇数个字节(最好使用64
数组)并查看您的系统是否仍然检测到它。
在任何情况下,你都不应该依赖这种方式来发现这些错误。始终使用valgrind或类似方法检查您的内存访问。