开发者社区> 问答> 正文

c语言中的内存分配

a123456678 2016-06-03 18:23:28 758

这个问题是关于c和c++中对于参数,变量在内存中地址分配的问题。对于以下代码

int main (int argc, char *argv[]) {
  int a;
  int b;
  a = 1;
  b = 2;
  return 0;
}

我的理解是,main函数是通过初始函数调用,main函数实际和其他函数一样。
在初始函数调用main函数后,会先将返回地址压入堆栈,接着将参数压入堆栈。面对函数中定义的局部变量,将会按照定义顺序分配堆栈内存空间。而堆栈是从高地址向低地址生长的,所以我认为&a > &b。
然而,在gdb调试过程中,我发现&b > &a。请问我的理解在哪里错了?

分享到
取消 提交回答
全部回答(1)
  • a123456678
    2019-07-17 19:27:01

    局部变量的空间不是一个一个压入栈中的,而是一次性分配好的,所以理解为变量依次入栈是错误的。C语言也没有规定局部变量在内存中的位置,只是常常实现为先定义的变量在高地址、后定义的变量在低地址。不过局部变量在栈上的位置没有绝对的关系,甚至不一定会出现在栈上。比如你的代码做这样的调整,改成下面这样:

    #include<stdio.h>
    
    int main()
    {
      int a = 1;
      int b = 2;
    
      printf( "a = %d, b = %d\n", a, b );
      printf( "&a = %08x, &b = %08x\n", &a, &b );
      return 0;
    }

    这个时候你会发现a变量确实分配在高地址,而b变量分配在低地址。如果你把你的程序加上-O2参数优化一下,那么a和b这两个变量因为没有被真正的使用,而被编译器优化掉,你直接p &a会得不到任何的值。

    0 0