C和C++中的静态变量存储在哪里?
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日
当一个程序被加载到内存中时,它被组织成不同的段。其中一个段是数据段。数据段被进一步划分为两部分:
- 初始化数据段:所有的全局、静态和常量数据都存储在这里。
- 未初始化数据段(BSS):所有的未初始化数据都存储在这个段。
下面是一个图表来解释这个概念:
这里有一个非常好的链接来解释这些概念:C语言内存管理:堆和栈