我想知道在哪个阶段,内存被分配给变量。 它是在编译阶段还是在执行时?
答案 0 :(得分:6)
是的,是的,都是。
对于全局变量(在文件范围内声明),编译器在可执行映像中保留内存。所以这是编译时。
对于自动变量(在函数中声明),编译器添加指令以在堆栈上分配变量。所以这是运行时
int a; // file scope
int f(void)
{
int b; // function scope
...
注意:
编译器有一(一组)指令一次性分配函数的所有局部变量。通常,每个变量没有开销(可能有例外我现在不讨论)。每次调用函数时都会执行这些指令。
编译器不为字符串分配存储空间。这是初学者经常犯的错误。考虑:
char *s; // a pointer to a strings
scanf("%s", s); // no, the compiler will not allocate storage for the string to read.
答案 1 :(得分:0)
使用malloc()
和朋友动态分配第三种内存。
此内存取自所谓的堆。虽然自动变量(你有函数)来自所谓的堆栈。
然后,如果您的变量具有永远不会更改值的初始值设定项(例如int i = 5;
),则编译器可能会计算出该值并且根本不会分配内存。相反,只要在代码中使用该变量,就会使用5
。
答案 2 :(得分:0)
这取决于变量/对象的类型。
在编译时已知全局和静态分配的变量,并且data segment中的偏移量烘焙到程序中。所以在某种程度上,他们在编译时得到分配。
在stack.上分配函数作用域本地的变量你可以说编译器知道关于它们以及它们所需的存储类型但很明显它们已经分配了(在生命的意义上)在运行时,在函数调用期间。
另一个有趣的对象是堆分配对象,可以使用C中的malloc / calloc和C ++中的新机制或相关机制创建。它们在运行时分配在堆部分中。