何时为c中的变量分配内存?它是在声明或初始化期间发生的吗?这是根据范围或存储类别而有所不同吗?
例如:
int i; <<<<<<<< memory gets allocated here?
i=10; <<<<<<<< memory gets allocated here?
我认为,它会在声明中自行分配。如果我错了,请更正我。
答案 0 :(得分:7)
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)
可以分配内存:
答案 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
}