2
我尝试通过编译以下代码来验证我对C中堆栈内存布局的理解,并检查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 &一:6812
& C:6824 & d:6828
$ rbp:6832(frame pointer)。
我很困惑。对于局部变量,功能参数不应该占用更高的内存地址。有人可以详细解释这个吗?谢谢。
编辑: 如果我打印内存不足,如:
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和a之间有8个字节的间隔c。我想这应该是回信地址?
一些堆叠向上生长,别人向下。取决于系统。 – dandan78 2014-10-10 07:49:48
如果您实际在代码中打印了变量的地址,您的代码和结果将更有意义,例如'printf(“%p,%p \ n”,&a,&b);'test'()'内 – unwind 2014-10-10 07:50:50
OP似乎在检查调试器中的地址 – dandan78 2014-10-10 07:54:25