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

栈上分配不同大小数组为何生成的ELF文件尺寸一致?[C语言]

问题解答

栈上声明的局部数组不会影响ELF文件的大小,核心原因是这类内存是程序运行时动态分配的,和ELF文件的静态存储空间完全无关,具体拆解如下:

  • 栈内存的分配逻辑:程序启动后,操作系统会为进程分配一块固定大小的栈空间(Linux默认通常是8MB)。当函数执行时,局部变量(包括你声明的big数组)是通过移动栈指针(比如x86_64架构的%rsp寄存器)来临时“预留”空间,整个过程只在运行时发生,不会在ELF文件里提前占用存储空间。
  • ELF文件的存储范围:ELF文件只保存程序的静态内容——比如代码段(.text,存编译后的指令)、数据段(.data,存已初始化的全局/静态变量)、BSS段(.bss,存未初始化的全局/静态变量,仅占符号表空间,不占文件实际字节)。栈上的局部变量不属于这些段,所以无论数组多大,都不会让ELF文件变大。
  • 你的案例验证:Prog.A和Prog.B的代码逻辑几乎完全一致——都是计算sizeof(big)并打印,编译后的指令没有本质差异,自然ELF文件的大小和结束地址完全相同。甚至如果big[100000000]的大小超过了栈的默认限制,程序运行时会直接触发栈溢出崩溃,但ELF文件本身还是不会有任何变化。

如果把数组改成全局变量,情况就完全不同了:

// 这个程序编译后的ELF文件会明显变大
int big[100000000];
int main() {
    printf("%zu\n", sizeof(big));
    return 0;
}

因为全局数组属于静态分配,会被放在ELF的.bss段(未初始化),如果是初始化的全局数组会放在.data段,直接增大ELF文件的大小。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 18:40:24