C++实现可输入行列的二维矩阵程序输入行数就闪退该如何解决
问题原因
- 第一个致命错误:
scanf读取整数时未传入变量地址。main函数中读取行列数的代码scanf("%d", row);和scanf("%d", col);不符合scanf的参数要求,scanf需要将输入值写入变量对应的内存地址,直接传入row/col会把变量当前的随机值当成内存地址,尝试写入时触发非法内存访问,直接导致程序崩溃,这就是输入行数后程序直接退出的直接原因。 - 第二个错误:读取矩阵元素的
scanf参数和格式符都存在问题:- 矩阵元素是
double类型,使用%d格式符会导致类型不匹配,读取的值会出现错乱 - 同样未传入元素的地址,直接写
A[i][j]是传入值而非地址,也会触发非法内存访问 - 格式符末尾多余的
\n会导致scanf需要匹配到换行后才结束输入,会出现输入一个值后需要多敲一次回车才能继续的异常体验。
- 矩阵元素是
可行修复方案
- 修正读取行列数的
scanf语句,给变量加上取地址符& - 修正矩阵元素读取的
scanf语句:- 将格式符换成适配
double类型的%lf - 给
A[i][j]加上取地址符& - 删掉格式符末尾多余的
\n
- 将格式符换成适配
- (可选优化)可以增加输入合法性校验,避免用户输入负数、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
相关产品推荐
相关产品推荐

