内存中BSS与DATA段的全局静态变量分配规则验证问询
示例代码
//Global space int A; int B = 0; int C = 0x01; static int D; static int E = 0; static int F = 0x01; void foo() { static int G; static int H = 0; static int I = 0x01; }
内存分配规则正确性说明
你总结的规则是主流编译环境下的通用实现标准,完全成立:
- BSS段用于存放所有静态存储期的零初始化变量,包含两类:一是未显式初始化的静态存储期变量(C标准规定这类变量会被自动零初始化),二是显式初始化为0的静态存储期变量。BSS段在可执行文件中不存储实际数据,仅记录需要预留的内存大小,程序加载时由操作系统统一将这块内存清零,以此压缩可执行文件体积。
- DATA段用于存放所有静态存储期、显式初始化为非零值的变量,这类变量的初始值会直接写入可执行文件,加载时直接拷贝到内存即可。
上述静态存储期变量覆盖三类:全局变量、全局static修饰的变量、函数内部static修饰的变量。函数内部的static变量仅作用域被限制在函数内,存储生命周期和全局变量完全一致,内存段分配规则没有区别。
补充说明:C语言标准本身不强制规定可执行文件的段划分逻辑,这部分是编译链和可执行文件格式的约定,但目前GCC、Clang、MSVC等所有通用编译链,对应ELF、PE等主流可执行格式,都严格遵循上述分配规则,不存在特殊例外。
变量分类结果确认
你给出的分类全部正确,核对结果如下:
A -- BSS (未显式初始化的全局变量) B -- BSS (显式初始化为0的全局变量) C -- DATA (显式初始化为非0值的全局变量) D -- BSS (未显式初始化的全局static变量) E -- BSS (显式初始化为0的全局static变量) F -- DATA (显式初始化为非0值的全局static变量) G -- BSS (未显式初始化的函数内static变量) H -- BSS (显式初始化为0的函数内static变量) I -- DATA (显式初始化为非0值的函数内static变量)
内容的提问来源于stack exchange,提问作者Sudhakar M
相关产品推荐
相关产品推荐

