什么时候为c中的变量分配内存?

时间:2015-04-17 07:38:54

标签: c variables declaration

何时为c中的变量分配内存?它是在声明或初始化期间发生的吗?这是根据范围或存储类别而有所不同吗?

例如:

int i; <<<<<<<< memory gets allocated here?
i=10;  <<<<<<<< memory gets allocated here?

我认为,它会在声明中自行分配。如果我错了,请更正我。

3 个答案:

答案 0 :(得分:7)

  • 本地函数变量在the stack frame上分配,并在调用函数时初始化。
  • 传递给函数的参数在堆栈中或通过寄存器传递。这取决于你的召集惯例。
  • 如果您使用malloc和朋友,则可以在the heap上分配。
  • static变量在data section中分配,如果它们具有初始化值(static int a=1;),否则它们将被隐式归零并在BSS section中分配(RBP register {1}})。在调用static int a;之前初始化它们。

至于你的具体例子,

main

编译器将在堆栈帧上分配int i; i = 10; 。它可能会马上设定价值。因此,它将在进入该范围时分配和初始化它。

以实例

为例
i

现在用

编译它
#include <stdio.h>

int main()
{
  int foo;
  foo = 123;
  printf("%d\n", foo);
}

这将生成程序集文件gcc -O0 a.c -S 。如果你检查它,你确实会看到a.s被复制在堆栈框架上:

foo

或,在Intel语法中(将movl $123, -4(%rbp) 添加到-masm=intel):

gcc

在下方,您会看到mov DWORD PTR [rbp-4], 123 。 {{3}}指的是堆栈帧,因此这种情况下的变量只存在于堆栈帧上,因为它仅用于调用call printf

答案 1 :(得分:5)

可以分配内存:

  • 由编译器在程序的一个数据段中。这些段是程序启动时(或根据需要分页)由OS加载的程序的一部分。 (静态变量)
  • 运行时在堆栈上。 (堆栈/自动变量)
  • 在运行时从堆中。 (通过malloc()或类似的东西)

答案 2 :(得分:3)

int bla = 12;  // bla is allocated prior to program startup

int foo(void)
{
    while (1)
    {
        /* ... code here ... */
        int plop = 42;  // plop is allocated at the entry of the while block
        static int tada = 271828; // tada is allocated prior to program startup
    }

    int *p = malloc(sizeof *p);  // object is allocated after malloc returns
}