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

cyh*_*one -2 c++ arrays memory-alignment

我检查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
Run Code Online (Sandbox Code Playgroud)

你可以在那里看到运行结果

的值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接近测试,但为什么'a'不接近'test + 3'.这是问题的关键.

use*_*738 5

test[-1] = 11;
test[4] = 11;
Run Code Online (Sandbox Code Playgroud)

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

您拥有的UB是因为`在未定义的行为中访问数组索引.