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 工具链。

原文由 Benoit 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 529
2 个回答

你的静态变量的去向取决于它们是否是 _零初始化的_。 零初始化 静态数据进入 .BSS (Block Started by Symbol)非零初始化 数据进入 .DATA

原文由 Don Neufeld 发布,翻译遵循 CC BY-SA 4.0 许可协议

这是如何(容易理解):

堆栈、堆和静态数据

原文由 Yousha Aleayoub 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题