静态分配的数组如何在 C 中的内存中布局?

Nik*_*CSB 1 c local-variables memory-layout

我正在尝试使用指向另一个 var 的指针来操纵一个 var 的值的指针,这基于本地 vars 通常如何在 C 程序中堆叠。

int i = 30;
int arr[4];

printf("%d\n", *(arr - 5)); // 30
Run Code Online (Sandbox Code Playgroud)
int arr[4];
int i = 30;

printf("%d\n", *(arr - 5)); // also 30
Run Code Online (Sandbox Code Playgroud)

我认为后者应该打印 30 for *(arr + 5),因为这就是我认为本地变量被推入堆栈的方式,但变量似乎以相同的方式在内存中布置。我想了解这里发生了什么。另外,我假设这是依赖于系统/编译器的。

das*_*h-o 5

简短回答:内存布局(不同变量之间)取决于编译器,并且取决于实现。

长答案:编译器可以决定如何为变量分配内存。虽然大多数编译器会按顺序分配内存,但不能保证。特别是在优化时,编译器可能能够消除未使用的变量,或者只是将它们放入寄存器中。

另一个因素是对齐。编译器可能会决定对变量重新排序以减少变量之间的填充。