2

我尝试通过编译以下代码并检查 gdb 中的地址来验证我对 C 中堆栈内存布局的理解。我只记录最低有效数字,较高的数字相同。输出是通过使用

print \u &a 

下面是一个简单的测试代码:

void test(int a,int b)
{
  int c = a;
  int d = b;
  printf("%d,%d\n",c,d);
}

int main()
{
  int x = 1;
  int y = 2;
  test(x,y);
  return 0;
}

如果我查看测试功能框架,我有以下结果,

&b: 6808 &a: 6812

&c: 6824 &d: 6828

$rbp:6832(帧指针)。

我很困惑。相对于局部变量,函数参数不应该位于更高的内存地址。有人可以详细解释一下吗?谢谢。

编辑:如果我像这样打印内存:

  printf("&a:%p,&b:%p\n",(&a),(&b));
  printf("&c:%p,&d:%p\n",(&c),(&d));

我有

  &a:0x7fff4737687c,&b:0x7fff47376878
  &c:0x7fff47376888,&d:0x7fff4737688c

它变成了bacd order。a 的结尾和 c 的开头之间有 8 个字节的间隙。我猜应该是回邮地址吧?

4

1 回答 1

0

根据函数的流程,首先分配参数,然后分配内部参数。您的担忧是基于堆栈向上增长的假设(这不是必需的)。

请点击以下链接以了解更多信息: 堆栈是向上增长还是向下增长?

于 2014-10-10T10:53:28.183 回答