似乎评论/答案只是停留在 C 标准描述上,让我们更深入地讨论具体的实现。
我在其他讨论中看到以下代码:
struct { size_t x; char a[]; } *p;
p = malloc(sizeof *p + 100);
if (p)
{
/* You can now access up to p->a[99] safely */
}
那么如果继续访问 p->a[i], 99
-
malloc 实现应该有一个“(sizeof *p + 100)”的虚拟内存块支持区域,因此在“i”超过 100 后,最初它应该只是虚拟内存块中的损坏数据,这可能是无害的。
-
如果稍后“i”超过虚拟内存块大小,而下一个块可用并且永远不会备份物理内存(意味着准备好分配),则在此错误访问中的下一个块将发生内核物理内存中的写时复制? malloc() 后来会意识到这一点吗?
-
如果下一个块不在堆管理中,p->a[i] 应该得到虚拟内存访问冲突错误吗?因为malloc()没有被调用,所以不会触发brk/sbrk来扩展进程堆的内存区域。
只是好奇这种情况下伤害有多大...
访问分配内存之外的内容是未定义的行为 https://en.wikipedia.org/wiki/Undefined_behavior。任何事情都可能发生。我听说有可能是鼻恶魔。
如果你真的很幸运,你可能会遇到访问冲突/段错误。如果你不幸运,那么程序中的其他一些变量可能会被覆盖,或者不会发生任何可观察到的事情,月亮可能会变成 7UP 徽标,或者可能有一些讨厌的东西从你的右鼻孔中挤出。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)