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

时间:2013-09-03 11:11:29

标签: c

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

4 个答案:

答案 0 :(得分:9)

按设计。

全局范围内的

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

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

简短回答: -

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

  

如果声明对象的文件范围标识符或   function包含存储类说明符 static ,标识符   有内部联系

内部链接意味着它仅在translational unit内可见。

详细解答:

全局变量(没有静态)具有外部链接,这意味着其他转化单位可以看到它。

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

让我们具体了解一些术语。(灵感来自C keywords (static)

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

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

e.g -

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声明),链接器将找不到此符号。

强调我的:)