在可执行文件的哪个段(.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 工具链。
你的静态变量的去向取决于它们是否是 零初始化的 。 零初始化 静态数据进入.BSS (Block Started by Symbol), 非零初始化 数据进入.DATA