在典型的C程序中,静态变量和全局变量都驻留在数据段上。静态变量的范围仍限于文件。相反,可以从任何地方访问全局变量。为什么会发生这种情况,尽管两者都存在于同一个内存中?
答案 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变量具有以下链接之一:
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
声明),链接器将找不到此符号。
强调我的:)