我尝试通过编译以下代码来验证我对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字节的间隙。我想这应该是回信地址吧?
1条答案
按热度按时间zfciruhq1#
按照函数的流程,首先分配参数,然后分配内部参数。您的担心是基于堆栈向上增长的假设(这不是必要的)。
请点击以下链接了解更多信息:Does stack grow upward or downward?