我尝试通过编译以下代码并检查 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 个字节的间隙。我猜应该是回邮地址吧?