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

C语言内存布局Size Variation疑问:静态变量分配异常解析

C语言data与bss段变量分配异常现象解释

问题代码

#include <stdio.h>

static int i;

int main()
{
    return 0;
}

命令行执行结果

PS E:\Programs\C\Programmieren in C> size file_16.exe
   text    data     bss     dec     hex filename
   2957    1928     480    5365    14f5 file_16.exe
PS E:\Programs\C\Programmieren in C> gcc file_16.c -o file_16.exe
PS E:\Programs\C\Programmieren in C> size file_16.exe
   text    data     bss     dec     hex filename
   2957    1928     448    5333    14d5 file_16.exe

将静态变量i初始化为24重新编译后,bss段大小减少32字节而非预期的4字节、data段无变化的现象,可从以下几点解释:

1. 内存对齐机制

CPU访问内存时遵循特定对齐规则(通常为8或32字节,取决于架构与编译选项),以此提升访问效率。链接器分配段空间时不会单独调整单个4字节变量的占用,而是以对齐块为单位操作。当i从bss段移至data段时,链接器释放的是i所在的整个32字节对齐块,而非仅变量本身的4字节。

2. PE文件的节分配规则

Windows平台下GCC生成的是PE格式可执行文件,段以**节(Section)**为单位划分。节的大小按内存页或更小的对齐单元(如32字节)分配,不存在小于最小对齐单元的节空间。静态变量i原本占据bss节中的一个32字节对齐块,移除后链接器直接回收该块,导致bss段总大小减少32字节。

3. data段无变化的原因

初始化后的静态变量i被放入data段时,链接器将其合并到了data节已有的空闲对齐间隙中,未触发data节的扩容操作,因此data段总大小未出现明显变化。

内容的提问来源于stack exchange,提问作者wdl4076

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 17:35:17