2014-10-10 108 views
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。我想这应该是回信地址?

+10

一些堆叠向上生长,别人向下。取决于系统。 – dandan78 2014-10-10 07:49:48

+4

如果您实际在代码中打印了变量的地址,您的代码和结果将更有意义,例如'printf(“%p,%p \ n”,&a,&b);'test'()'内 – unwind 2014-10-10 07:50:50

+3

OP似乎在检查调试器中的地址 – dandan78 2014-10-10 07:54:25

回答

0

根据函数的流程,分配第一个参数,然后分配内部参数。 您的担忧是基于堆栈向上生长的假设(这不是必需的)。

请按照下面的链接,更多的了解: Does stack grow upward or downward?