我尝试通过编译以下代码验证我对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个字节的间隙。我猜它应该是返回地址?
答案 0 :(得分:0)
根据函数的流程,首先分配参数,然后分配内部参数。 您的担忧是基于堆栈向上增长的假设(这是不必要的)。
请按照以下链接了解更多信息: Does stack grow upward or downward?