全局变量(内存绑定)

时间:2013-09-28 15:23:18

标签: c static global-variables

请考虑以下代码:

#include<stdio.h>
int a=0;

int main()
{
//some code
}

我已经了解到静态变量的物理内存绑定是在加载时完成的。 何时为'a'完成内存绑定?它存储在哪里,在堆栈区域或静态区域?

3 个答案:

答案 0 :(得分:2)

正如已经指出的那样,一般行为是依赖于平台的,因此没有普遍有效的答案,但在大多数现代的“正常”系统中,会发生的事情是编译器生成.data部分。生成的目标文件,包含您定义的变量的初始化值。

当你启动程序时,程序加载器将.data部分直接从可执行文件映射到新创建的进程'虚拟内存中,可供程序读取和写入(可能)使用一些COW方案将每个进程的副本保密。

你使用的术语“记忆绑定”不是正常术语的一部分,所以我不确切地知道你在问什么,但这可能有帮助吗?

答案 1 :(得分:0)

a位于静态存储空间中,因为它是全局。只有函数的 local 变量位于堆栈上。

您可以在函数中使用static关键字来使该变量的存储类型为静态。

但是,全局变量上的static具有不同的含义(因为它们已经是静态存储类型):变量的符号不会导出到目标文件,因此该变量不能直接从其他变量访问模块(.c文件)。

答案 2 :(得分:0)

编译时,编译器知道“a”是一个全局变量,并将“a”放入可执行文件的数据部分。在该区域中,可执行文件记录“a”的虚拟地址。并且当可执行文件被加载到操作系统中以便运行时,并且在运行期间使用“a”时,OS将物理地址映射到虚拟地址“a”。可执行文件的其余代码只需知道“a”的虚拟地址即可访问它,操作系统将执行映射并转到物理内存进行读/写。并且“a”的虚拟地址由编译器在编译期间确定。

更多的知识,“计算机系统:程序员的视角”一书是一个很好的来源。