暂定定义和内存分配

时间:2016-03-29 17:01:46

标签: c mingw codeblocks

我写了下面的代码(仅用于理解目的)。在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语句)?

2 个答案:

答案 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符号是在文件范围内声明的符号,并且初始化为零因为这就是标准所说的应该是的。