请求排查:用户输入二维数组尺寸的C程序运行异常问题
问题排查与修复方案
核心问题分析
你的代码存在两个关键问题,其中第一个直接导致程序运行异常:
变长数组(VLA)声明时机错误
在C语言中,变长数组的维度必须是已初始化的整数变量。但你在声明int arr[n][x];时,n和x还未被用户输入赋值,此时它们的值是内存中的随机垃圾值,这会导致数组大小不可控,进而引发内存访问越界、程序崩溃等问题。变量命名与逻辑不匹配(可读性问题)
代码中提示输入“columns(列)”时读取到变量n,输入“rows(行)”时读取到x,但后续循环却用n控制行数、x控制列数,这种命名与逻辑的错位会增加代码维护难度,也容易引发逻辑错误。
修复后的代码
#include <stdio.h> int main(void) { int rows, cols, i, j; // 先获取行和列的有效数值 printf("Enter number of rows: "); scanf("%d", &rows); printf("Enter number of columns: "); scanf("%d", &cols); // 基于已赋值的变量声明变长数组 int arr[rows][cols]; printf("Enter elements:\n"); for (i = 0; i < rows; i++) { for (j = 0; j < cols; j++) { scanf("%d", &arr[i][j]); } } printf("The array you entered is:\n"); for (i = 0; i < rows; i++) { for (j = 0; j < cols; j++) { printf("%d\t", arr[i][j]); } printf("\n"); } return 0; }
关键修改说明
- 调整数组声明顺序:先通过
scanf获取rows和cols的有效值,再用它们声明变长数组,确保数组大小是明确且合法的。 - 优化变量命名:将
n、x改为rows、cols,让变量名直接对应其代表的含义,与输入提示、循环逻辑完全匹配,提升代码可读性。 - 完善代码结构:给双层循环添加大括号,避免后续扩展代码时出现逻辑歧义;增加输出提示文本,让程序交互更清晰。
内容的提问来源于stack exchange,提问作者Asmaa Magdy
相关产品推荐
相关产品推荐

