如何在C中编译静态和动态变量

如何在C中编译静态和动态变量,c,arrays,dynamic,static,compilation,C,Arrays,Dynamic,Static,Compilation,为什么编译器不知道C语言中动态变量的地址,例如动态数组的地址 是因为在编译程序之前没有声明variablearray的大小吗 或者,我想,一个更好的问题是:编译器在编译程序时如何分配静态变量或数组的地址?编译器将开始独立编译每个源文件。 当涉及到静态变量时,它会将其存储在.bss或.data节中,具体取决于其是否初始化。 所有对象文件的所有段都放在一起,称为程序内存映射。如果主函数调用另一个源文件的函数,则被调用函数的地址将是一个“虚拟”地址,在链接过程中被替换。 静态变量不会导出到链接器,这就

为什么编译器不知道C语言中动态变量的地址,例如动态数组的地址

是因为在编译程序之前没有声明variablearray的大小吗


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

编译器将开始独立编译每个源文件。 当涉及到静态变量时,它会将其存储在.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时,应该会出现链接器错误

编译器在编译时在数据段中生成可能重复的静态和全局变量;未初始化的数据放入称为bss段的数据段的一部分,该部分用零填充。在运行时分配的变量是堆栈和堆变量。它们的位置取决于创建它们时的内存布局。什么是动态数组?根据我在讲座中所听到的,当一个地址声明为ex int*b,然后在主函数中调用*b=malloc4*sizeofint,那么这将创建一个大小为4的数组。@PeterChung我认为你的讲座称之为动态数组对你没有任何好处。名称是heap变量。发生的事情是,当进程启动时,它的地址空间中有一个称为heap的区域。C库具有malloc、free和friends函数,允许您从该区域保留内存以供使用。它从低地址向上增长,因此当您调用malloc时,它返回给您的内存取决于堆在运行时的外观。编译器没有办法知道它。