为什么这段极简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
相关产品推荐
相关产品推荐

