为什么C数组尾部有额外的字节?

时间:2017-12-10 10:31:38

标签: c++ arrays memory-alignment

我检查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'。这是问题的关键。

1 个答案:

答案 0 :(得分:5)

test[-1] = 11;
test[4] = 11;

这是未定义的行为。(意味着任何事情都可能发生)。在您的情况下,您更改了b的值,因为它们在分配它们的内存中相邻。但你不应该依赖它。因为这可能会破坏您的程序或在大多数情况下导致错误的代码行为。

你拥有的UB是因为`在未定义的行为中访问数组索引超出范围。“