在C中堆栈内存布局

时间:2014-10-10 07:47:59

标签: c memory memory-layout

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

生成输出
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

它变成了按顺序。 a和c的结尾之间有8个字节的间隙。我猜它应该是返回地址?

1 个答案:

答案 0 :(得分:0)

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

请按照以下链接了解更多信息: Does stack grow upward or downward?