【发布时间】:2010-10-31 21:17:22
【问题描述】:
全局变量的作用域是所有文件,而静态全局变量的作用域只是它所在的文件被宣布。为什么这样?
全局或静态全局变量存储在内存中的什么位置?
【问题讨论】:
标签: c memory variables standards
全局变量的作用域是所有文件,而静态全局变量的作用域只是它所在的文件被宣布。为什么这样?
全局或静态全局变量存储在内存中的什么位置?
【问题讨论】:
标签: c memory variables standards
有一些混淆,因为 C 中的 static 可能意味着两个不同的东西。一是静态存储时长,二是内部联动。 static 用作文件范围内的关键字将给出与内部链接一起使用的函数或对象。
函数或对象的内部链接意味着如果您在另一个“文件”中声明另一个函数(这实际上不是称为“文件”,而是翻译单元 - TU),那么该声明将引用 a不同 功能:在该单元中声明的名称将“链接”到与在该翻译单元中声明的名称不同的实体,该名称是该翻译单元的“内部”。这同样适用于对象。
无论文件范围变量是否使用static 声明,它仍然具有静态存储持续时间:这意味着它存在于整个程序中,并在程序终止时消失。具有静态存储持续时间的对象的另一个示例是字符串文字。没有指定存储具有静态存储持续时间的对象的位置,但通常根据它们是否已初始化来存储它们:初始化的文件范围变量通常存储在名为“.data”的部分中,而非初始化的文件-范围变量通常存储在名为“.bss”的部分中。请记住,如果变量未初始化,它将在程序开始时初始化为零:“.bss”部分通常由程序启动时的实现初始化为零。
我在任何地方都说“通常”,因为没有指定存储东西的位置。例如,某些实现可以将字符串文字存储在只读部分中。如果你有一个文件范围指针并且不初始化它,实现会将它初始化为一个空指针,它不一定是一个全为空字节的对象:)
【讨论】:
它们都存储在数据段中;不同之处在于全局具有外部可见的链接器符号,而静态全局则没有。
【讨论】:
全局变量的作用域在所有文件中。而静态全局变量的作用域只是声明它的文件。为什么会这样?
全局变量旨在可从任何模块访问 - 这种做法被认为是不好的做法,只有在绝对必要时才应使用。
文件范围的静态变量(我假设你说“静态全局”时所说的)可以由单个编译单元(通常是文件)中的例程访问 - 这样做的原因是限制它的范围.在修改使用该变量的代码时,您需要查看哪些其他例程可能受到影响的位置有一个很好的限制。它还减少了名称冲突的机会。
使用全局变量时,如果另一组模块碰巧也出于不同目的使用了同名的全局变量,则您必须修改其中一组以使用不同的名称。静态变量不存在这个问题。
【讨论】:
不能从其他文件访问静态全局变量,而可以使用 extern 关键字访问全局变量。
【讨论】:
关于静态和全局的面试问题要记住的要点
【讨论】:
C 标准没有指定它们在内存中的存储位置,这与 C 程序员无关。访问变量的能力由编译器和链接器控制。
这是您就该主题区域提出的第二个问题。使用像 C 这样相对高级的编程语言的主要原因之一是您不必担心这些问题。
【讨论】:
我们使用静态属性来隐藏模块内的变量和函数声明,就像我们在 Java 和 C++ 中使用公共和私有声明一样。 C 源文件扮演模块的角色。使用 static 属性声明的任何全局变量或函数都是该模块私有的。类似地,没有静态属性声明的任何全局变量或函数都是公共的,并且可以被任何其他模块访问。尽管使用 'global' 关键字定义为变量或函数是一种很好的做法。
这两个变量都存储在可重定位文件的 .data 或 .bss 部分中。
【讨论】: