C语言以文件大小为行列创建矩阵触发SIGSEGV段错误如何解决
段错误触发原因分析
- 核心触发点是栈上分配的超大变长数组(VLA)导致栈溢出:
64位系统下long类型占8字节,两个10KB文件对应的维度均为10240,你申请的二维数组总大小为(10240+1) * (10240+1) * 8 ≈ 800MB,而操作系统给程序默认分配的栈空间通常仅为1~8MB,完全无法容纳这么大的内存块,栈边界被冲破后直接触发SIGSEGV段错误。 - 存在潜在风险:你写的
calculateDim函数没有校验fopen的返回值,如果目标文件不存在、无读取权限会导致fopen返回NULL,后续fseek操作空指针也会触发段错误,建议补充空指针判断逻辑。
修复建议
不要在栈上申请超大内存,改用堆内存分配即可,参考代码:
// 申请二维数组 long **matrix = malloc((dim1 + 1) * sizeof(long *)); for (long i = 0; i <= dim1; i++) { matrix[i] = malloc((dim2 + 1) * sizeof(long)); } // 使用完成后释放内存避免泄漏 for (long i = 0; i <= dim1; i++) { free(matrix[i]); } free(matrix);
内容的提问来源于stack exchange,提问作者Eugenio
相关产品推荐
相关产品推荐

