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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 13:15:01