为什么编译器不知道 C 中动态变量的地址(例如动态数组)?
是不是因为程序编译前没有声明变量(数组)的大小?
或者,我想,一个更好的问题是:编译器在编译程序时如何分配静态变量(或数组)的地址?
最佳答案
编译器将开始独立编译每个源文件。 当涉及到静态变量时,它会将其存储在 .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 的 header 。然后再次执行这三个步骤
调用 ld 时应该会收到链接器错误
关于c - C语言中静态变量和动态变量是如何编译的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28312214/