静态变量存储在哪里(在C / C ++中)?

在可执行文件的段(.BSS,.DATA,其他)中存储了哪些静态变量,以避免名称冲突? 例如:


foo.c:                         bar.c:
static int foo = 1;            static int foo = 10;
void fooTest() {               void barTest() {
  static int bar = 2;            static int bar = 20;
  foo++;                         foo++;
  bar++;                         bar++;
  printf("%d,%d", foo, bar);     printf("%d, %d", foo, bar);
}                              }

如果我编译这两个文件并将其链接到重复调用fooTest()和barTest的main,则printf语句将独立增加。 因为foo和bar变量对于翻译单元是本地的,所以是有意义的。

但分配的存储位置在哪里?

要清楚,假设是你有一个工具链可以输出ELF格式的文件。 因此,我认为,必须一定的空间,为那些静态变量的可执行文件保留。
出于讨论的目的,我们假设我们使用GCC工具链。


你的静态位置取决于它们是否被初始化。 0初始化的静态数据进入.BSS(符号启动块),非0初始化数据进入.DATA


当一个程序被加载到内存中时,它被组织成不同的段。 其中一部分是数据段。 数据段进一步细分为两部分:

初始化数据段:所有全局,静态和常量数据都存储在此处。
未初始化的数据段(BSS):所有未初始化的数据都存储在此段中。

这里是解释这个概念的图表:

在这里输入图像描述


这里是解释这些概念的非常好的链接:

http://www.inf.udec.cl/~leo/teoX.pdf


实际上,变量是元组(存储,范围,类型,地址,值):

storage     :   where is it stored, for example data, stack, heap...
scope       :   who can see us, for example global, local...
type        :   what is our type, for example int, int*...
address     :   where are we located
value       :   what is our value

局部作用域可能意味着本地翻译单元(源文件),函数或块取决于其定义的位置。 要使变量对多个函数可见,它肯定必须位于DATA或BSS区域中(取决于是否分别初始化它们)。 然后将其范围限定为源文件中的所有功能或功能。

链接地址: http://www.djcxy.com/p/14471.html

上一篇: Where are static variables stored (in C/C++)?

下一篇: What is a stack trace, and how can I use it to debug my application errors?