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

C语言大型数组引发Segmentation Fault问题求助

问题原因分析

这段代码触发段错误的核心原因是栈内存溢出:

  • 先计算数组内存占用:8640 × 15360 = 132710400 字节,约合126.6MB。
  • 程序的栈(Stack)默认空间非常有限,WSL的Linux环境中栈大小通常仅为8MB或16MB,你直接在栈上分配远超其容量的数组,直接触发了栈溢出,导致段错误。
解决方法

方法一:用堆内存分配一维数组

堆的可用空间远大于栈,适合存放大型数据,推荐用calloc(自动初始化内存为0)或malloc:

#include <stdlib.h>

int main() {
    unsigned char *test = calloc(8640 * 15360, sizeof(unsigned char));
    if (test == NULL) {
        // 处理内存分配失败的情况
        return 1;
    }
    // 访问方式:test[row * 15360 + col] 等价于二维数组的test[row][col]
    // ... 业务代码
    free(test); // 用完必须释放内存,避免泄漏
    return 0;
}

方法二:动态分配二维数组(保留二维语法)

如果习惯用test[row][col]的访问方式,可以用指针数组实现:

#include <stdlib.h>

int main() {
    unsigned char **test = malloc(8640 * sizeof(unsigned char*));
    if (test == NULL) return 1;

    for (int i = 0; i < 8640; i++) {
        test[i] = malloc(15360 * sizeof(unsigned char));
        if (test[i] == NULL) {
            // 分配失败时需释放已分配的内存
            for (int j = 0; j < i; j++) free(test[j]);
            free(test);
            return 1;
        }
    }
    // 直接用test[row][col]访问
    // ... 业务代码
    // 释放内存
    for (int i = 0; i < 8640; i++) free(test[i]);
    free(test);
    return 0;
}

注意:动态分配的内存必须手动释放,否则会造成内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 09:25:28