c - 暂定定义和内存分配

标签 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 语句中)?

最佳答案

这是两个不同的变量。

对于全局int b;,内存是在程序首次加载到内存时分配的。它分配在程序的全局内存中,可以从程序中的任何位置轻松访问。

对于main()的本地int b=16;是在栈上分配的,在main()函数框架中。它只能从该函数直接访问。其他任何事情都需要 main() 传递变量地址或堆栈上的一些复杂的指针算术。

本地b 隐藏全局b,因为它们具有相同的名称,因此您无法在此函数中使用全局b(某些语言允许这样做,C 不允许),但仅此而已。它们是不同的变量,如果您更改名称,程序的二进制文件(即实际执行的指令)不会改变。

关于c - 暂定定义和内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36290592/

相关文章:

编译 OpenCL HelloWorld 程序 : Linker Error

c - 如何使用指针访问递归结构

c - '*' token 之前解析错误

ruby - 将 proc 作为 block 提供给方法

c++ - “g++”在 Windows 8 上未被识别为内部或外部命令

c++ - 使用 MinGW 在 Windows 上编译 PDCurses

codeblocks - 如何使用 Code Block 编码和编译 Pascal?

c - fork 示例帮助

c - 使用 realloc() 获得精确数量 vs malloc() 获得太多

linux - GCC 未在 pacman 安装时添加到系统路径