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

C++实现可输入行列的二维矩阵程序输入行数就闪退该如何解决

问题原因
  • 第一个致命错误:scanf 读取整数时未传入变量地址。main 函数中读取行列数的代码 scanf("%d", row); 和 scanf("%d", col); 不符合scanf的参数要求,scanf需要将输入值写入变量对应的内存地址,直接传入row/col会把变量当前的随机值当成内存地址,尝试写入时触发非法内存访问,直接导致程序崩溃,这就是输入行数后程序直接退出的直接原因。
  • 第二个错误:读取矩阵元素的scanf参数和格式符都存在问题:
    1. 矩阵元素是double类型,使用%d格式符会导致类型不匹配,读取的值会出现错乱
    2. 同样未传入元素的地址,直接写A[i][j]是传入值而非地址,也会触发非法内存访问
    3. 格式符末尾多余的\n会导致scanf需要匹配到换行后才结束输入,会出现输入一个值后需要多敲一次回车才能继续的异常体验。
可行修复方案
  1. 修正读取行列数的scanf语句,给变量加上取地址符&
  2. 修正矩阵元素读取的scanf语句:
    • 将格式符换成适配double类型的%lf
    • 给A[i][j]加上取地址符&
    • 删掉格式符末尾多余的\n
  3. (可选优化)可以增加输入合法性校验,避免用户输入负数、0等无效值作为行列数,进一步提升程序鲁棒性。
修正后的完整代码
#include <cstdio>
typedef double** DMatrix;
DMatrix Matrix(int row, int col) {
    DMatrix x = new double* [row];
    for (int r=0; r<row; r++){
        x[r] = new double[col];
    }
    return x;
}

void Delete(DMatrix x, int row){
    for (int r=0; r<row; r++){
        delete[] x[r];
    }
    delete[] x;
}

int main (){
    int row , col;
    printf("Enter number of row : "); scanf("%d", &row);
    printf("Enter number of column : "); scanf("%d", &col);
    DMatrix A = Matrix(row, col);
    for (int i=0; i<row; i++){
        for (int j=0; j<col; j++){
            printf("Enter number in element %d%d :", i, j);
            scanf("%lf", &A[i][j]);
        }
    }
    for (int r=0; r<row; r++){
        for (int c=0; c<col; c++){
            printf("%lf\t", A[r][c]);
        }
        printf("\n");
    }
    Delete(A, row);
    return 0;
}

内容的提问来源于stack exchange,提问作者P.Chian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 14:45:04