<分区>
- 静态整数 i=0; 我分配的变量在哪里?是在BSS还是初始化数据段?
- 存储类“extern”和“register”的变量存储在哪里?
我可能请提供代码片段来交叉检查上面的内容
标签 c
<分区>
我可能请提供代码片段来交叉检查上面的内容
最佳答案
如果不知道您正在处理的具体实现,就不可能肯定地说。在某些情况下,static int i=0;
将存储在已初始化的数据段中,因为您提供了初始化程序。在其他情况下,BSS 无论如何都会被零初始化,所以链接器无论如何都会把它放在那里。如果您指定了一个不同的值(例如,static int i=12345;
),那么您可以更好地确保它被放置在一个初始化数据段中。
extern
并不能真正确定链接器将放置变量的位置。它与上面的差不多:如果链接器知道(或安排)BSS 是零初始化的,那么 BSS 中可能存在没有指定初始化程序的 extern 。如果 BSS 不是零初始化的,它通常必须位于已初始化的数据段中。
register
基本上等同于 auto
-- 它们都是在运行时分配的,通常是在寄存器中或堆栈中。
就验证而言,这将更加依赖于个别实现。您通常会通过查看链接器映射文件之类的东西来找到答案;如果您想自己弄清楚,很可能需要查看正在使用的符号格式,或者探查您系统的可执行格式的内部结构。
关于C程序内存映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4107207/