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

When does memory gets allocated for a variable in c?

什么时候为 c 中的变量分配内存?它是否发生在声明或初始化期间?这是否因范围或存储而异 class?

例如:

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

我想,如果我错了,它会在声明时分配itself.Correct我。

可分配内存:

  • 在编译程序的一个程序数据段中。这些段是程序启动时(或根据需要调入)由 OS 加载的程序的一部分。 (静态变量)
  • 运行时在栈上。 (Stack/auto 个变量)
  • 运行时来自堆。 (通过 malloc() 或类似的东西)
  • 局部函数变量在 the stack frame 上分配并在调用函数时初始化。
  • 传递给函数的参数要么在堆栈上,要么通过寄存器传递。这取决于您的调用约定。
  • 如果您使用 malloc 和朋友,它们可以在 the heap 上分配。
  • static 变量分配在 data section if they have initialization values (static int a=1;), otherwise they will implicitly be zeroed out and allocated in the BSS section (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 被复制到堆栈帧上:

movl    3, -4(%rbp)

或者,在 Intel 语法中(将 -masm=intel 添加到 gcc):

mov     DWORD PTR [rbp-4], 123

在其正下方您会看到一个 call printfRBP register 指的是栈帧,所以这个变量在这种情况下只存在于栈帧中,因为它只用于调用 printf.

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
}