什么时候为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 printf
。
RBP 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
}
什么时候为 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 printf
。
RBP 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
}