8

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

4

4 回答 4

9

按设计。

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

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

内存中数据的实际排列是一个实现细节,并且会因编译器和平台而异。

于 2013-09-03T11:16:34.613 回答
3
Why does it happen, although both resides in the same memory?

简短的回答:-

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

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

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

详细解答:

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

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

让我们具体理解几个术语。(灵感来自C 关键字(静态)

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

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

例如-

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在函数内具有不同的含义),您将禁止其他单元访问它,例如,如果您尝试在另一个单元内使用该变量(用 声明extern),链接器将找不到此符号。

强调我的:)

于 2013-09-03T11:52:11.843 回答
2

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

于 2013-09-03T11:14:09.967 回答
1

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

于 2013-09-03T11:14:29.867 回答