如何用C编译静态和动态变量

时间:2015-02-04 01:55:54

标签: c arrays dynamic static compilation

为什么编译器不知道C中动态变量的地址(例如动态数组)?

是因为在编译程序之前没有声明变量(数组)的大小吗?

或者,我想,更好的问题是:编译器在编译程序时如何分配静态变量(或数组)的地址?

1 个答案:

答案 0 :(得分:0)

编译器将开始独立编译每个源文件。 当谈到静态变量时,它将它存储在.bss或.data部分中,具体取决于它是否已初始化。 如果你的主函数调用另一个源文件的函数,所有对象文件的所有段被放在一起称为程序存储器映射,被调用函数的地址将是一个“虚拟”地址,在链接期间被替换处理。 静态变量不会导出到链接器,这就是没有其他源文件可以访问另一个源文件的静态变量的原因,因为链接器无法看到它。因此,想象编译器在编译过程中不会抛出错误,当所有目标文件链接在一起时会抛出错误。

如果你想逐步尝试一下 使用

将两个源文件编译为目标文件
gcc -c source1.c -o object1.o
gcc -c source2.c -o object2.o

然后将其与

链接在一起
ld object1.o object2.o 

如果你想看到static只是链接器的一个关键字,你就可以这样做

给source1.c一个source2.c的头文件,其中包含一个名为test但没有关键字static的变量或数组。在source2.c中,您使用关键字static定义相同的变量 请不要在source2.c本身中包含source2.c的标题。然后再做三个步骤

调用ld

时应该会出现链接器错误