静态变量和全局变量都驻留在数据段中。 尽管如此,静态变量的范围有限。 为什么?

在典型的C程序中,静态变量和全局变量都驻留在数据段上。 静态变量的范围仍限于文件。 相反,可以从任何地方访问全局变量。 为什么会发生这种情况,尽管两者都存在于同一个内存中?

 Why does it happen, although both resides in the same memory? 

简短回答: –

根据C11标准( 6.2.2标识符的链接 )第4段:

如果对象或函数的文件范围标识符的声明包含staticclass说明符static ,则标识符具有内部链接

内部连接意味着它仅在其平移单元内可见。

详细解答:

全局变量 (没有静态)具有外部链接,这意味着它对其他转换单元可见。

当您使用文件范围声明静态变量时,它具有内部链接,但是当您使用块范围声明它时,它没有链接。

让我们具体了解一些术语。(灵感来自C关键词(静态) )

AC变量具有以下链接之一:

  • 无链接: –具有块范围的变量没有链接 。这意味着它们对于定义它们的块是私有的。 具有自动,线程和动态存储持续时间的所有变量都具有此链接,以及在块范围内声明为static的变量。 具有文件范围的变量可以具有内部或外部链接。
  • 内部链接: –可以从当前翻译单元中的所有范围引用变量。 在文件范围声明的所有变量都具有此链接,包括在文件范围内声明为static的变量。
  • 外部链接: –变量可以从整个程序中的任何其他翻译单元引用。 所有声明为extern或const且没有显式存储类说明符但不是静态的变量都具有此链接。

例如-

 int i = 5; // file scope, external linkage static int j = 3; // file scope, internal linkage ... ... int main() { ... ... } int func () { static int num;// block scope – no linkage . . . } 

通过在文件级别声明变量static(函数中的static具有不同的含义),您禁止其他单元访问它,例如,如果您尝试在另一个单元内使用该变量(使用extern声明),链接器将找不到此符号。

强调我的:)

按设计。

全局范围内的static是用来表示“我希望这些变量在范围上受限的关键字;我不想关心其他模块声明的同名变量”。 使用这个关键字的原因与不使用它有关,实际上正是它存在的原因。

注意关键字在不同的上下文中意味着不同的东西; 在函数范围static意味着“此变量的内容应该在函数调用之间保持”。

内存中数据的实际排列是一个实现细节,并且在编译器和平台之间会有所不同。

静态变量的概念是它们不是全局的,并且不会“污染”全局命名空间。 这意味着我可以在5个不同的函数中使用变量’count’,它们不会发生冲突。 范围将变量限制在其上下文中。

从技术上讲,你可以访问任何东 编译器不会给你一个内存地址 – 你必须自己得到它。 不知何故。