我检查C数组尾部可能有一些额外的字节。
有我的代码
b
您可以看到正在运行的结果there
通过更改test[-1]
的值来更改test[4]
的值。但是当我更改a
的值时,a
的值不会改变;
我使用gdb检查他们的地址,发现
在g ++ 6.4.0中,test[4]
的{{1}}子地址的地址为8个字节
在clang ++ 3.8.1中,a
的{{1}}子地址的地址是4个字节
所以,我很好奇为什么数组在尾部有一些字节?
感谢@Peter A.Schneider解释这个问题。 它肯定是UB,但它只是一个实验性代码。这不是对实用代码的讨论。
通常,运行时堆栈中的变量靠得很近。 test[4]
接近测试,但为什么'a'不接近'test + 3'。这是问题的关键。
答案 0 :(得分:5)
test[-1] = 11;
test[4] = 11;
这是未定义的行为。(意味着任何事情都可能发生)。在您的情况下,您更改了b
的值,因为它们在分配它们的内存中相邻。但你不应该依赖它。因为这可能会破坏您的程序或在大多数情况下导致错误的代码行为。
你拥有的UB是因为`在未定义的行为中访问数组索引超出范围。“