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

为何超大数组sizeof输出异常?何时触发运行时错误?

栈上超大数组的异常输出与内存问题

先看你给出的代码:

#include <stdio.h>

int main(void) {
    char big_array[10000000000];
    printf("%d", sizeof(big_array));
    return 0;
}

为什么输出1410065408而非10000000000?

这是整数溢出导致的问题。10000000000远大于32位有符号整数的最大值(231-1=2147483647),多数编译器处理数组大小时,若用32位整数类型解析这个数值,会发生截断:将10000000000对232取模,结果就是1410065408。编译器实际按这个溢出后的数值创建数组,所以sizeof(big_array)返回的是这个错误的大小。

何时会触发栈内存不足的运行时错误?

栈的大小是有限制的(比如Linux系统默认栈大小通常为8MB左右),只有当溢出后的数组大小仍然超过栈的可用空间时,才会触发栈溢出的运行时错误(比如段错误)。如果溢出后的数值刚好小于等于栈的可用空间,程序会成功分配数组,不会报错,只会输出截断后的错误数值。

举个例子:若把数组大小改成更大的数,溢出后的值超过8MB,运行程序就会直接崩溃;但如果溢出后的值在栈的范围内,就会像你现在的情况一样,输出错误数值但程序能正常运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 21:42:11