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

Kar*_*ick 3 c variables declaration

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

例如:

int i; <<<<<<<< memory gets allocated here?
i=10;  <<<<<<<< memory gets allocated here?
Run Code Online (Sandbox Code Playgroud)

我想,它会在声明中自行分配.如果我错了,请更正我.

csl*_*csl 7

  • 本地函数变量在堆栈帧上分配,并在调用函数时进行初始化.
  • 传递给函数的参数要么在堆栈中,要么通过寄存器传递.这取决于您的调用约定.
  • 如果您使用和朋友,可以在堆上分配它们malloc.
  • 如果static变量具有初始化值(),则在数据部分中分配变量static int a=1;,否则它们将被隐式地归零并在BSS部分(static int a;)中分配.它们在呼叫之前被初始化main.

至于你的具体例子,

int i;
i = 10;
Run Code Online (Sandbox Code Playgroud)

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

举个例子

#include <stdio.h>

int main()
{
  int foo;
  foo = 123;
  printf("%d\n", foo);
}
Run Code Online (Sandbox Code Playgroud)

现在编译一下

gcc -O0 a.c -S
Run Code Online (Sandbox Code Playgroud)

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

movl    $123, -4(%rbp)
Run Code Online (Sandbox Code Playgroud)

或者,在Intel语法中(添加-masm=intelgcc):

mov     DWORD PTR [rbp-4], 123
Run Code Online (Sandbox Code Playgroud)

在下面你会看到一个call printf.该RBP寄存器是指栈帧,所以在这种情况下,该变量永远只存在堆栈帧,因为它在调用只用printf.


Cra*_*son 5

内存可以分配:

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