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)
我想,它会在声明中自行分配.如果我错了,请更正我.
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=intel到gcc):
mov DWORD PTR [rbp-4], 123
Run Code Online (Sandbox Code Playgroud)
在下面你会看到一个call printf.该RBP寄存器是指栈帧,所以在这种情况下,该变量永远只存在堆栈帧,因为它在调用只用printf.
内存可以分配: