我尝试通过编译以下代码来验证我对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它变成了b,a,c,d顺序。在a的末尾和c的开头有一个8字节的间隙。我猜它应该是回信地址?
发布于 2014-10-10 18:53:28
根据函数的流程,首先分配参数,然后分配内部参数。您的关注点是基于堆栈向上增长的假设(这是不必要的)。
请点击下面的链接了解更多信息:Does stack grow upward or downward?
https://stackoverflow.com/questions/26294376
复制相似问题