C和C++中的静态变量存储在哪里?

26 浏览
0 Comments

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()的主程序中,printf语句会独立递增。这是有道理的,因为foo和bar变量是翻译单元的局部变量。

但是,存储分配在哪里?

需要明确的是,假设您具有可以输出ELF格式文件的工具链。因此,我认为可执行文件中必须为这些静态变量保留一些空间。

出于讨论目的,让我们假设我们使用GCC工具链。

admin 更改状态以发布 2023年5月24日
0
0 Comments

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

  • 初始化数据段:所有的全局、静态和常量数据都存储在这里。
  • 未初始化数据段(BSS):所有的未初始化数据都存储在这个段。

下面是一个图表来解释这个概念:

enter image description here

这里有一个非常好的链接来解释这些概念:C语言内存管理:堆和栈

0
0 Comments

静态数据的存储位置取决于它们是否经过零初始化。经过零初始化的静态数据存储在 .BSS (符号块开始) 中,未经零初始化的数据存储在 .DATA 中。

0