我写了下面的代码(仅用于理解目的)。在main之外,int b;意味着暂定。在main int b = 16内部是一个局部变量。函数变量b内部有内部链接(文件范围)。输出为16和0.我读到只有在初始化时才为暂定定义的变量分配内存。所以这里我的问题是在函数内部,printf打印b的值,并在printf调用时分配内存吗?如果是这样的话,我可以说在首次访问(无论是初始化还是访问)时,内存被分配给暂时定义的变量?还是我错了?
int b;
int b;
void f1(int a1);
int main ()
{
int b=16;
printf("b=%d\n",b);
f1(5);
return 0;
}
void f1(int a1)
{
printf("b = %d\n",b);
}
编辑: 增加更多清晰度: 我知道函数内部的变量与main中的变量不同。还要注意局部变量在堆栈中。我的问题是关于暂定的定义。 int b被声明两次,它在C中被接受,因为它是暂定的。如果它是实际定义,则不允许多个定义,因此不接受。关于暂定定义有几个问题(About Tentative definition)。根据他们中的一个“C有一个特殊的”暂定“定义”规则允许同一变量的多个定义,只要它们都匹配,并且最多只有一个初始化器。幕后的C编译器结合了所有的试验性定义为单一定义。“ 所以重新解释一下我的问题:
如果只是暂时定义变量但未使用变量,是否会分配内存? (假设编译器没有优化代码)。看起来在翻译单元结束时,内存根据上面链接的问题进行分配。 或者是否仅在第一次使用时分配内存(在本例中为printf语句)?
答案 0 :(得分:0)
这是两个不同的变量。
对于全局int b;
,在程序首次加载到内存时分配内存。它分配在程序的全局内存中,可以从程序中的任何位置轻松访问。
对于main()
,在int b=16;
功能框中的堆栈上分配了本地main()
。它只能从该函数直接访问..其他任何东西要求main()
传递变量地址或堆栈上的一些复杂指针算法。
本地b
隐藏全局b
,因为它们具有相同的名称,因此您无法使用此函数中的全局函数(某些语言允许这样做,C不会是的,但就是这样。它们是不同的变量,如果更改名称,程序的二进制文件(即执行的实际指令)不会改变。
答案 1 :(得分:0)
请参阅此答案,解释为什么int b;
初始化为零。
Does gcc automatically initialize static variables to zero?
main中的int b;
位于堆栈上并设置为16.在函数f1
中,范围内唯一的b
符号是在文件范围内声明的符号,并且初始化为零因为这就是标准所说的应该是的。