时
int main()
{
int j;
}
j
的内存是在编译时分配的,但是在编译期间的哪个时间?
在分配变量内存时,编译有哪些不同的阶段?
如果 j
是全局的会怎样?
时
int main()
{
int j;
}
j
的内存是在编译时分配的,但是在编译期间的哪个时间?
在分配变量内存时,编译有哪些不同的阶段?
如果 j
是全局的会怎样?
我猜你把事情搞混了。
编译器不会为变量分配内存 - 它生成的代码会在运行时分配内存。对于全局变量,它将被添加到程序启动代码中。
#include<stdio.h>
int i;
void foo(int n)
{
if(n > 2)
return;
printf("From foo &n = %xd\n", &n);
printf("From foo &i = %xd\n", &i);
foo(n+1);
}
int main()
{
printf("&i = %xd\n", &i);
foo(0);
return 0;
}
./a.out
&i = 600934d
From foo &n = 38bc4efcd
From foo &i = 600934d
From foo &n = 38bc4eccd
From foo &i = 600934d
From foo &n = 38bc4e9cd
From foo &i = 600934d
这里有两件事情需要注意:
foo
)在每次调用foo时都会改变。实际上,它会每次减少,因为栈向下增长。在编译时,'int j' 并不会被分配内存,在应用程序进入main()函数作用域时才会被分配(实际上它并不是严格意义上的被分配,而是使用了栈)。全局变量会在进入main()函数作用域之前被分配内存。
编译会生成程序的可执行代码。当运行这个可执行代码时,程序内存被分配。
内存在编译时并未分配,而是在运行时分配。 编译器只生成了将执行您的程序的机器代码,实际的分配发生在运行时。 在这种情况下,变量未被使用,因此不会为其生成任何代码。
编译器决定将变量 j 放在哪里。通常情况下,局部变量会被放置在栈上,因此对于你的特定示例,编译器可能会在整个 main 函数的执行期间为其保留栈空间。请注意,这与全局变量内存不同,全局变量可能会有自己的内存。
我觉得你关注的是编译的阶段,而不是变量 'j' 的内存分配。因为我这么认为,以下是发生的情况:
当你将源代码输入C编译器时,首先进行的是词法和语义分析阶段,用于分析源代码的语法和语义是否正确。如果发现错误,编译器会相应地报告并停止继续执行。如果没有发现错误,它会继续生成源代码的中间表示形式,通常在进行各种优化后。这个中间表示可以是本地语言(与操作系统/架构相关,比如C)或平台无关的字节码(比如Python/Java..)。编译器的功能到此结束。
内存分配仅在执行代码时发生,这是程序的运行时。这仅发生在编译阶段之后,也许你不想在这里了解。如果你想知道,请告诉我,我会尽力添加我所知道的内容。
希望对你有帮助。