我写了下面的代码(仅供理解之用)。在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 语句中)?
最佳答案
这是两个不同的变量。
对于全局int b;
,内存是在程序首次加载到内存时分配的。它分配在程序的全局内存中,可以从程序中的任何位置轻松访问。
对于main()
的本地int b=16;
是在栈上分配的,在main()
函数框架中。它只能从该函数直接访问。其他任何事情都需要 main()
传递变量地址或堆栈上的一些复杂的指针算术。
本地b
隐藏全局b
,因为它们具有相同的名称,因此您无法在此函数中使用全局b
(某些语言允许这样做,C 不允许),但仅此而已。它们是不同的变量,如果您更改名称,程序的二进制文件(即实际执行的指令)不会改变。
关于c - 暂定定义和内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36290592/