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

在main函数内创建大二维数组触发运行时错误的原因排查

栈溢出导致运行错误的原因分析

问题场景

在Windows 11的Cygwin环境下使用GCC进行C语言开发时,出现以下差异现象:

  1. 在main函数内声明2048×2048的int二维数组,编译通过但运行报错:
#include <stdio.h>

int main(void)
{   
    int src[2048][2048];
    
    return 0;
}

运行时错误信息:

0 [] a 1717 cygwin_exception::open_stackdumpfile: Dumping stack trace to a.exe.stackdump
  1. 将同样大小的数组声明为全局变量,运行无任何错误:
#include <stdio.h>

int src[2048][2048];

int main(void)
{   
    return 0;
}
  1. 使用malloc在堆上动态分配同样大小的数组,编译和运行均正常:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{   
    int r = 2048, c = 2048;
 
    int* ptr = malloc((r * c) * sizeof(int));

    for (int i = 0; i < r * c; i++)
        ptr[i] = i + 1;

    free(ptr);
    
    return 0;
}

原因解析

问题的核心是栈空间不足引发栈溢出,三种变量的存储区域有着本质区别:

  • 局部数组(栈存储):函数内的局部变量默认存在栈(Stack)中,栈是一块大小固定且有限的内存区域(Cygwin默认栈大小通常仅为几MB)。计算数组占用内存:2048×2048×4字节 = 16MB,这个大小远超栈的默认容量,程序运行时直接触发栈溢出,导致错误并生成栈转储文件。
  • 全局数组(全局存储区):全局变量存储在全局/静态存储区,这块内存的大小不受栈限制,仅受系统可用物理内存约束,16MB的数组完全可以被容纳,因此运行正常。
  • 动态分配数组(堆存储):malloc申请的内存来自堆(Heap),堆是程序运行时可动态扩展的内存区域,其大小上限为系统物理内存加虚拟内存,远大于栈的固定容量,因此不会出现溢出问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 08:53:24