You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

内存中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 01:57:26