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

为什么这段极简C代码运行会产生Segmentation fault段错误?

问题原因

报错的根源是栈溢出(Stack Overflow):

  • 单个double类型占8字节,你声明的两个长度为600000的double数组,总占用内存为 600000 * 8 * 2 = 9600000 字节 ≈ 9.16 MB
  • Linux、macOS等类Unix系统默认的用户态进程栈空间大小普遍为8MB左右,数组总大小超过了栈的容量上限,触发内存访问错误,操作系统抛出Segmentation fault: 11。

你观察到的现象完全符合这个逻辑:

  • 删除ys数组后,仅单个数组占用600000 * 8 = 4.58 MB,小于8MB栈上限,因此可以正常运行
  • 数组大小调整为500000后,两个数组总占用500000 * 8 * 2 = 7.63 MB,仍未超过8MB栈上限,因此也可以正常运行

修复方案

  • 方案1:将栈上数组改为静态存储
    给数组加static关键字,数组会被分配到全局数据区,不受栈大小限制:
    int main(int argc, char *argv[])
    {
        static double xs[600000];
        static double ys[600000];
        return 0;
    }
    
  • 方案2:使用动态内存分配,在堆上申请空间
    堆的内存容量远大于栈,适合存储大体积数组,使用完后需要手动释放内存避免泄漏:
    #include <stdlib.h>
    int main(int argc, char *argv[])
    {
        double *xs = malloc(600000 * sizeof(double));
        double *ys = malloc(600000 * sizeof(double));
        // 业务逻辑代码
        free(xs);
        free(ys);
        return 0;
    }
    
  • 方案3(仅本地测试用,不推荐):调整系统栈大小限制
    可移植性差,生产环境不适用。Linux/macOS下可以执行命令ulimit -s 16384将栈上限临时调整为16MB。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 08:39:02