0

可能重复:
堆栈上的局部变量分配顺序

(x86_64 Linux 上的 C 程序)我试图了解变量分配给堆栈内存的方式。据我了解,堆栈帧中的变量向较低的内存地址移动。下面的程序显示了这一点。

int main() {
    int i = 6;
    char buffer[8];

    return 0;
}

程序编译为:gcc -g prog.c

调试显示:

(gdb) x/x &i
0x7fffffffe04c: 0x00000006
(gdb) x/x buffer
0x7fffffffe040: (random data)

字符数组的内存地址低于整数 i 变量。我的问题是,当声明的顺序如下所示颠倒时,整数变量 i 仍然位于大于字符数组的内存地址处?

int main() {
  char buffer[8];
  int i = 6;

  return 0;
}

(gdb) x/x &i
0x7fffffffe04c: 0x00000006
(gdb) x/x buffer
0x7fffffffe040: (random data)

对于严格地说单个整数变量的排序,似乎不会出现此问题。如果交换整数声明的顺序,最早声明的将在堆栈帧中具有更高的内存地址。这里的问题是为什么字符数组会发生这种情况。我已经在另一篇文章中阅读了这个答案,但我想知道是否有人对此有明确的解释。

4

0 回答 0