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

为何数组分别用1和全0初始化后生成的可执行文件大小差异很大

可执行文件大小差异的核心原因

你给出的两个示例中array都是全局作用域变量,产生大小差异的本质是C编译体系对全局变量的存储分段规则不同,两类初始化的数组会被分配到完全不同的二进制段中:

  • 全0初始化的全局变量会被放入 BSS段,该段不会占用磁盘上的可执行文件空间
  • 存在非0初始值的全局变量会被放入 DATA段,该段的所有初始值需要完整保存在可执行文件中

第一种代码(数组全0初始化)

示例代码:

int array[5000] = {0};
int main(){}

C语言标准规定,当数组显式初始化为{0}时,所有未显式赋值的元素都会自动初始化为0,此时整个数组的初始值全为0。
这种情况下编译器会将array直接分配到BSS段:

BSS段的作用是专门存放需要初始化为0的全局数据,它在可执行文件中仅存储「所需内存总大小」这个元数据,不会存储实际的0值内容。程序加载运行时,操作系统会自动把BSS段对应的内存区域全部清零,不需要从磁盘读取任何数据。
5000个int占约20KB的内存,但这些0值不需要写入可执行文件,因此不会额外增加文件体积。


第二种代码(数组存在非0初始值)

示例代码:

int array[5000] = {1};
int main(){}

此时数组首元素被初始化为1,剩余4999个元素自动初始化为0,数组存在非0的初始值,因此不能放到BSS段,必须分配到DATA段:

DATA段用来存放有显式非0初始值的全局数据,所有元素的初始值(哪怕是自动补的0)都需要完整写入可执行文件中,程序加载时直接从磁盘读取这部分内容到内存即可。
整个数组的约20KB初始值都会被打包到可执行文件里,自然比第一种情况的文件大了近20KB。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 06:12:00