全局变量的范围在所有文件中,而 静态全局变量的范围就是它所在的文件被宣布。为什么这样?
存储在内存中的全局或静态全局变量在哪里?
答案 0 :(得分:28)
有一些混乱,因为C中的static
可能意味着两件不同的事情。一个是静态存储持续时间,另一个是内部链接。在文件范围中用作关键字的static
将为其提供与内部链接一起使用的函数或对象。
函数或对象的内部链接意味着如果您在另一个“文件”中声明另一个函数(这不是真正称为“文件”,而是转换单元 - TU),那么该声明将引用 a不同的函数:在该单元中声明的名称将“链接”到与该其他翻译单元中声明的名称不同的实体,该名称是该TU的“内部”。这同样适用于对象。
是否使用static
声明文件范围变量,它仍然具有静态存储持续时间:这意味着它贯穿整个程序,并在程序终止时死亡。具有静态存储持续时间的对象的另一示例是字符串文字。存储静态存储持续时间的对象未指定,但通常存储它们取决于它们是否已初始化:初始化文件范围变量通常存储在名为“.data”的部分中,而非初始化文件-scope变量通常存储在名为“.bss”的部分中。请记住,如果变量未初始化,则在程序开始时将初始化为零:“。bss”部分通常由程序启动时的实现初始化为零。
我说“通常”到处都是,因为没有指定存储的东西。例如,某些实现可以将字符串文字存储在只读部分中。如果你有一个文件范围指针并且没有初始化它,那么实现会将它初始化为一个空指针,它不一定是一个具有所有空字节的对象:)
答案 1 :(得分:18)
它们都存储在数据段中;区别在于全局具有外部可见的链接器符号,而静态全局不具有。
答案 2 :(得分:7)
全局变量的范围在所有文件中..而静态全局变量的范围只是声明它的文件..为什么会这样?
全局变量旨在可以从任何模块访问 - 这种做法被认为是不好的做法,并且只有在绝对必要时才应该使用。
文件范围的静态变量(当你说“静态全局”时我假设你正在谈论的)可以由单个编译单元(通常是文件)中的例程访问 - 其原因是限制它的范围。在修改使用该变量的代码时,您需要查看可能受影响的其他例程的位置有一个很好的限制。它还减少了名称冲突的机会。
当使用全局变量时,如果另一组模块碰巧也使用具有相同名称的全局变量用于不同目的,则必须将一组修改为使用不同的名称。静态变量不存在这个问题。
答案 3 :(得分:6)
使用extern
关键字访问全局变量时,无法从其他文件访问静态全局变量。
答案 4 :(得分:1)
C标准没有规定它们在存储器中的存储位置,并且它与C程序员无关。访问变量的能力由编译器和链接器控制。
这是您在此主题领域提出的第二个问题。使用像C这样的高级编程语言的一个主要原因是你不必担心这些问题。
答案 5 :(得分:1)
我们使用静态属性隐藏模块内的变量和函数声明,就像我们在Java和C ++中使用公共声明和私有声明一样。 C源文件扮演模块的角色。使用static属性声明的任何全局变量或函数对该模块都是私有的。类似地,没有静态属性声明的任何全局变量或函数都是公共的,并且可以由任何其他模块访问。虽然将全局'全局'定义为变量或函数是一个好习惯。关键字。
这两个变量都存储在可重定位文件的.data或.bss部分中。
答案 6 :(得分:1)
要记住要破解采访静态和全球的问题