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

dex*_*ous 7 c

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

moo*_*dow 9

按设计.

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

请注意,关键字在不同的上下文中表示不同的内容; 在函数范围static意味着"此变量的内容应该在函数调用之间保持".

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


0de*_*al0 3

Why does it happen, although both resides in the same memory?\n
Run Code Online (Sandbox Code Playgroud)\n\n

简短回答:-

\n\n

来自 C11 标准(6.2.2 标识符的链接)第 4 段:

\n\n
\n

如果对象或函数的文件作用域标识符的声明包含存储类说明符static,则标识符具有内部链接

\n
\n\n

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

\n\n

详细解答:

\n\n

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

\n\n

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

\n\n

让我们具体了解几个术语。(受C 关键字(静态)启发)

\n\n

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

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

例如-

\n\n
int i = 5; // file scope, external linkage\nstatic int j = 3; // file scope, internal linkage\n...\n...\nint main()\n{\n...\n...\n}\nint func ()\n{\nstatic int num;// block scope \xe2\x80\x93 no linkage\n. . .\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

强调我的:)

\n