C++ size=5动态矩阵删除最值所在列代码运行异常问题求解
问题排查与修复
核心错误原因
你代码的问题出在新矩阵的列赋值逻辑上:
- 你直接用新矩阵的列下标
j和要删除的原矩阵列号(minsvt/maxsvt)做判断,二者没有对应关系:新矩阵的列索引是连续的,但原矩阵中跳过删除列后,剩余列的索引是不连续的,二者无法直接对齐 - 这就导致当要删除的列号小于
size-n时,对应的新矩阵位置会被跳过,最终存储未初始化的垃圾值,只有当删除列是3、4(刚好大于等于size-n=2或3)的时候,不会触发continue逻辑,才看起来运行正常 - 额外小问题:
minsvt、maxsvt没有初始值,若矩阵第一个元素就是最值,这两个变量会是随机值导致异常
修复方案
修改新矩阵的赋值逻辑:遍历原矩阵的所有列,判断当前列是否需要删除,不需要删除的才复制到新矩阵的当前可用列位置,用单独变量计数新矩阵的列索引。
修复后完整代码
#include <iostream> #include <cstdlib> #include <ctime> #include <iomanip> using namespace std; int main() { srand(time(0)); int size=5; int n; int min, max, minsvt=0, maxsvt=0; // 初始化列号变量 int** matrix=new int* [size]; for (int i=0; i<size; i++) matrix[i]=new int[size]; for (int i=0; i<size; i++) { for (int j=0; j<size; j++) { matrix[i][j]=1+rand()%50; cout<<setw(5)<<matrix[i][j]; } cout<<endl; } min=matrix[0][0]; max=matrix[0][0]; for (int i=0; i<size; i++) { for (int j=0; j<size; j++) { if (matrix[i][j]>max) { max=matrix[i][j]; maxsvt=j; } if (matrix[i][j]<min) { min=matrix[i][j]; minsvt=j; } } } cout<<"minimum element value- "<<min<<endl; cout<<"minimum element column number- "<<minsvt<<endl; cout<<"maximum element value- "<<max<<endl; cout<<"maximum element column number- "<<maxsvt<<endl; if (minsvt==maxsvt) n=1; else n=2; int** matrix1=new int* [size]; for (int i=0; i<size; i++) matrix1[i]=new int[size-n]; // 修正后的赋值逻辑 for (int i=0; i<size; i++) { int new_col = 0; // 新矩阵的当前列索引,每行重置 for (int j=0; j<size; j++) // 遍历原矩阵所有列 { if (j==minsvt || j==maxsvt) // 是要删除的列就跳过 continue; matrix1[i][new_col] = matrix[i][j]; new_col++; // 新矩阵列索引后移 } } // 输出新矩阵 for (int i=0; i<size; i++) { for (int j=0; j<size-n; j++) { cout<<setw(5)<<matrix1[i][j]; } cout<<endl; } // 释放动态内存避免泄漏 for (int i=0; i<size; i++){ delete[] matrix[i]; delete[] matrix1[i]; } delete[] matrix; delete[] matrix1; return 0; }
内容的提问来源于stack exchange,提问作者Sandro Tushabramishvili
相关产品推荐
相关产品推荐

