为什么编译器不知道C中动态变量的地址(例如动态数组)?
是因为在编译程序之前没有声明变量(数组)的大小吗?
或者,我想,更好的问题是:编译器在编译程序时如何分配静态变量(或数组)的地址?
答案 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
时应该会出现链接器错误