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'.这是问题的关键.
test[-1] = 11;
test[4] = 11;
Run Code Online (Sandbox Code Playgroud)
这是未定义的行为.(意味着任何事情都可能发生).在您的情况下,您更改了值,b因为它们在分配它们的内存中相邻.但你不应该依赖它.因为这可能会破坏您的程序或在大多数情况下导致错误的代码行为.
您拥有的UB是因为`在未定义的行为中访问数组索引.