c - 'global' 和 'static global' 之间的区别

标签 c memory variables standards

全局变量的作用域是所有文件,而静态全局变量的作用域只是它所在的文件被宣布。为什么这样?

全局或静态全局变量存储在内存中的什么位置?

最佳答案

有一些混淆,因为 C 中的 static 可能意味着两种不同的东西。一是静态存储时长,二是内部联动。 static 用作文件范围内的关键字将给出与内部链接一起使用的函数或对象。

函数或对象的内部链接意味着如果您在另一个"file"中声明另一个函数(这实际上不是称为"file",而是翻译单元 - TU),那么该声明将引用 a不同 功能:在该单元中声明的名称将“链接”到与在该翻译单元中声明的名称不同的实体,该名称是该翻译单元的“内部”。这同样适用于对象。

无论文件范围变量是否使用 static 声明,它仍然具有静态存储持续时间:这意味着它在整个程序中都存在,并在程序终止时消失。具有静态存储持续时间的对象的另一个示例是字符串文字。没有指定存储具有静态存储持续时间的对象的位置,但通常根据它们是否已初始化来存储它们:初始化的文件范围变量通常存储在名为“.data”的部分中,而非初始化的文件-范围变量通常存储在名为“.bss”的部分中。请记住,如果变量未初始化,它将在程序开始时初始化为零:“.bss”部分通常由程序启动时的实现初始化为零。

我在任何地方都说“通常”,因为没有指定存储东西的位置。例如,某些实现可以将字符串文字存储在只读部分中。如果你有一个文件范围指针并且不初始化它,实现会将它初始化为一个空指针,它不一定是一个全为空字节的对象:)

关于c - 'global' 和 'static global' 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/959889/

相关文章:

c - 在结构中初始化一个数组

c - 当我删除第一个节点时,它会生成无限循环错误

c - 套接字上具有数据数组的C结构

java - 在 eclipse.ini 中定义 --launcher.XXMaxPermSize 后,Eclipse 无法创建 JVM

c++ - C/C++ 声明和定义的变量变为不可见

C++ 奇怪的变量值

c - 如何在 eclipse 中重命名(重构)c 宏

c++ - 为什么这个 C++ 结构体占用 96 字节内存?

c - 结构体与链表代码C中动态分配的结构体

java - 如何从 VariableDeclarationStatement 获取方法名称