c - C语言中静态变量和动态变量是如何编译的

标签 c arrays dynamic static compilation

为什么编译器不知道 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/

相关文章:

c - 如何引用二维数组中的单个字符?

c++ - 通过 C 中的指针从 R 中的 big.matrix 访问一 block 内存

arrays - 谁记得根据有效数字的数量将 4 字节整数打包到 1 到 4 字节数组的算法?

ruby-on-rails - 如何在 Ruby on Rails 5 中验证 pg 数组长度?

vba - 在数据透视 + VBA + 动态解决方案中运行所有可能的页面过滤器组合

c# - 从 C# 调用 tap_example.py 获取 Membase TAP Stream

c - 尽管再次使用 O_CREAT,但以相同名称重新打开时 shm_open() 失败

c - 如何从预处理器启用内在函数

php - 不同目的地的数组排序算法

html - div 内的 div - 如何自动 averflow 到其余空间?