我检查了 C 数组尾部可能有一些额外的字节。
有我的代码
int a = 5;
int test[] = {1,2,3,4};
int b = 5;
test[-1] = 11;
test[4] = 11;
cout << b << endl; // 11
cout << a << endl; // 5
可以看到运行结果there https://wandbox.org/permlink/Wp555Rr0TxId1G2R
的价值b
通过改变而改变test[-1]
的值。但当我改变时test[4]
的值, 的值a
没有改变;
我用gdb查看他们的地址,发现
在 g++ 6.4.0 中,地址a
减去地址test[4]
是8个字节
在 clang++ 3.8.1 中,地址a
减去地址test[4]
是 4 个字节
所以,我很好奇为什么数组尾部有一些字节?
感谢@Peter A.Schneider 解释这个问题。
它肯定是一个 UB ,但它只是一个实验代码。这不是对实际代码的讨论。
一般来说,运行时堆栈中的变量是靠得很近的。b
很接近test,但是为什么'a'不接近'test+3'。这就是问题的关键。
test[-1] = 11;
test[4] = 11;
这是未定义的行为。(意味着任何事情都可能发生)。在你的情况下,你改变了值b
因为它们在分配的内存中是相邻的。但你不应该依赖它。因为这可能会破坏您的程序或在大多数情况下导致错误的代码行为。
你拥有的UB是因为`在未定义的行为中访问超出范围的数组索引。"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)