C程序内存映射

标签 c

<分区>

  1. 静态整数 i=0; 我分配的变量在哪里?是在BSS还是初始化数据段?
  2. 存储类“extern”和“register”的变量存储在哪里?

我可能请提供代码片段来交叉检查上面的内容

最佳答案

如果不知道您正在处理的具体实现,就不可能肯定地说。在某些情况下,static int i=0; 将存储在已初始化的数据段中,因为您提供了初始化程序。在其他情况下,BSS 无论如何都会被零初始化,所以链接器无论如何都会把它放在那里。如果您指定了一个不同的值(例如,static int i=12345;),那么您可以更好地确保它被放置在一个初始化数据段中。

extern 并不能真正确定链接器将放置变量的位置。它与上面的差不多:如果链接器知道(或安排)BSS 是零初始化的,那么 BSS 中可能存在没有指定初始化程序的 extern 。如果 BSS 不是零初始化的,它通常必须位于已初始化的数据段中。

register 基本上等同于 auto -- 它们都是在运行时分配的,通​​常是在寄存器中或堆栈中。

就验证而言,这将更加依赖于个别实现。您通常会通过查看链接器映射文件之类的东西来找到答案;如果您想自己弄清楚,很可能需要查看正在使用的符号格式,或者探查您系统的可执行格式的内部结构。

关于C程序内存映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4107207/

相关文章:

c - "warning : No new line at end of file"是什么意思?

c++ - 如何避免公共(public)头文件中#define 的编译时间过长

c - 用于创建游戏的 Midi C 库

c - C语言中如何使用指向多维数组的指针?

c - 如何强制用户输入正整数?

Linux 上的 C : Parse arguments from '<' and '|'

c - 这是为了验证密码

c - htonl() 与 __builtin_bswap32()

c - __attribute__((always_inline)) 失败

c - 如何在 shell 脚本中使用多核(i7 机器)运行 c 程序