C语言填充2列二维数组时触发segmentation fault报错求助
段错误根因
代码触发段错误的核心原因是数组声明时使用了未初始化的变量作为长度:
- 定义二维数组
float T[nb][2]时,还没执行scanf给nb赋值,此时nb是未初始化的局部变量,存储的是栈内存里的随机垃圾值,系统会按照这个随机值给数组分配空间,数组实际长度完全不可控。 - 后续给
nb输入具体数值后,数组的长度不会重新调整,循环写入数据时很容易超出数组实际分配的内存范围,访问到未分配给程序的内存地址,直接触发段错误。 - 额外风险:没有对
nb的输入值做合法性校验,如果用户输入0、负数这类无效值,后续循环的边界判断会直接失效,同样会引发内存访问异常。
修正方案
把二维数组的声明挪到nb读取完成之后即可,建议补充简单的输入合法性判断,修正后的代码如下:
#include <stdio.h> int main() { int i,nb; printf("How many measures?\n"); scanf("%d",&nb); // 校验输入合法性,避免无效值引发异常 if (nb <= 0) { printf("Invalid input, please enter a positive number.\n"); return 1; } // 读取到合法行数后再初始化对应长度的数组 float T[nb][2]; for(i=0;i<nb;i++) { printf("What's the temperature T%d ?\n",i); scanf("%f",&T[i][0]); printf("What's the humidity H%d ?\n",i); scanf("%f",&T[i][1]); } return 0; }
注:上述代码用到的变长数组(VLA)是C99标准引入的特性,如果编译器版本较旧不支持C99,可以改用
malloc动态申请堆内存存储二维数组,核心逻辑和上述写法一致。
内容的提问来源于stack exchange,提问作者klenzis
相关产品推荐
相关产品推荐

