在典型的C程序中,静态变量和全局变量都驻留在数据段上.静态变量的范围仍限于文件.相反,可以从任何地方访问全局变量.为什么会发生这种情况,尽管它们都存在于同一个内存中?
按设计.
static在全局范围内,您使用的关键字是"我希望这些变量在范围上受限;我不想关心其他模块声明的同名变量".使用这个关键字的原因与不使用它有关,实际上正是它存在的原因.
请注意,关键字在不同的上下文中表示不同的内容; 在函数范围static意味着"此变量的内容应该在函数调用之间保持".
内存中数据的实际排列是一个实现细节,并且在编译器和平台之间会有所不同.
Why does it happen, although both resides in the same memory?\nRun Code Online (Sandbox Code Playgroud)\n\n简短回答:-
\n\n来自 C11 标准(6.2.2 标识符的链接)第 4 段:
\n\n\n\n\n如果对象或函数的文件作用域标识符的声明包含存储类说明符static,则标识符具有内部链接。
\n
内部链接意味着它仅在其平移单元内部可见。
\n\n详细解答:
\n\n全局变量(无静态)具有外部链接,这意味着它对其他翻译单元可见。
\n\n当您使用文件作用域声明静态变量时,它具有内部链接,但是当您使用块作用域声明它时,它没有链接。
\n\n让我们具体了解几个术语。(受C 关键字(静态)启发)
\n\nAC 变量具有以下链接之一:
\n\n例如-
\n\nint 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}\nRun Code Online (Sandbox Code Playgroud)\n\n通过在文件级别声明变量 static (static在函数内具有不同的含义),您可以禁止其他单元访问它,例如,如果您尝试在另一个单元内使用该变量(用 声明extern),链接器将找不到该符号。
强调我的:)
\n