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

请求排查:用户输入二维数组尺寸的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;
}

关键修改说明

  1. 调整数组声明顺序:先通过scanf获取rows和cols的有效值,再用它们声明变长数组,确保数组大小是明确且合法的。
  2. 优化变量命名:将n、x改为rows、cols,让变量名直接对应其代表的含义,与输入提示、循环逻辑完全匹配,提升代码可读性。
  3. 完善代码结构:给双层循环添加大括号,避免后续扩展代码时出现逻辑歧义;增加输出提示文本,让程序交互更清晰。

内容的提问来源于stack exchange,提问作者Asmaa Magdy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 11:03:29