'全球'和'静态全球'之间的区别

Twi*_*day 23 c memory variables standards

一个全局变量的范围中的所有文件,而静态全局变量的范围只是在声明文件.为什么这样?

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

Joh*_*itb 28

有一些混乱,因为static在C中可能意味着两件不同的事情.一个是静态存储持续时间,另一个是内部链接.static用作文件范围的关键字将给出与内部链接一起使用的函数或对象.

函数或对象的内部链接意味着如果你在另一个"文件"中声明另一个函数(这不是真正称为"文件",而是翻译单元 - TU),那么该声明将引用一个不同的函数:声明的名称在该单位将"链接"到与该另一个翻译单元中声明的名称不同的实体,该单元是该TU的"内部".这同样适用于对象.

无论是否声明了文件范围变量static,它仍然具有静态存储持续时间:这意味着它贯穿整个程序,并在程序终止时死亡.具有静态存储持续时间的对象的另一示例是字符串文字.存储静态存储持续时间的对象未指定,但通常存储它们取决于它们是否已初始化:初始化的文件范围变量通常存储在名为".data"的部分中,而非初始化文件-scope变量通常存储在名为".bss"的部分中.请记住,如果变量未初始化,则在程序开始时将初始化为零:".bss"部分通常由程序启动时的实现初始化为零.

我说"通常"到处都是,因为没有指定存储的东西.例如,某些实现可以将字符串文字存储在只读部分中.如果你有一个文件范围指针并且没有初始化它,那么实现会将它初始化为一个空指针,它不一定是所有空字节的对象:)

  • 这个答案似乎很难理解! (3认同)

Dav*_*ave 18

它们都存储在数据段中; 区别在于全局具有外部可见的链接器符号,而静态全局不具有.


Mic*_*urr 7

全局变量的范围在所有文件中..而静态全局变量的范围只是声明它的文件..为什么会这样?

全局变量旨在可从任何模块访问 - 这种做法被认为是不良实践,并且只有在绝对必要时才应使用.

文件范围的静态变量(我假设你在谈论"静态全局"时所说的)可以由单个编译单元(通常是文件)中的例程访问 - 其原因是限制它的范围.在修改使用该变量的代码时,您需要查看可能受影响的其他例程的位置有一个很好的限制.它还减少了名称冲突的机会.

使用全局变量时,如果另一组模块碰巧也使用具有相同名称的全局变量用于不同目的,则必须将一个模块修改为使用其他名称.静态变量不存在该问题.


小智 7

无法从其他文件访问静态全局变量,而可以使用extern关键字访问全局变量.