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

C++动态数组最小列查找及销售业绩查询访问违例问题求助

问题解答

一、如何在C++中从动态数组中找出最小的列

首先明确:这里的“最小的列”默认指列内元素的最小值是所有列中最小的,思路也适用于“列总和最小”的场景。不管用原生指针实现的动态数组,还是更安全的vector,核心步骤都是一致的:

  1. 确定动态数组的行数和列数;
  2. 遍历每一列,计算该列的最小值;
  3. 对比所有列的最小值,定位到最小的那个列。

示例代码(推荐用vector,避免内存管理坑)

#include <iostream>
#include <vector>
#include <climits>

using namespace std;

int main() {
    int rows, cols;
    cout << "输入行数:";
    cin >> rows;
    cout << "输入列数:";
    cin >> cols;

    // 创建二维动态数组,vector自动处理内存分配释放
    vector<vector<int>> arr(rows, vector<int>(cols));
    cout << "输入数组元素:" << endl;
    for (int i = 0; i < rows; ++i) {
        for (int j = 0; j < cols; ++j) {
            cin >> arr[i][j];
        }
    }

    int min_col_val = INT_MAX;
    int min_col_index = 0;

    // 遍历每一列找最小值
    for (int j = 0; j < cols; ++j) {
        int current_col_min = INT_MAX;
        for (int i = 0; i < rows; ++i) {
            if (arr[i][j] < current_col_min) {
                current_col_min = arr[i][j];
            }
        }
        // 更新全局最小列信息
        if (current_col_min < min_col_val) {
            min_col_val = current_col_min;
            min_col_index = j;
        }
    }

    cout << "最小的列是第" << min_col_index + 1 << "列,最小值为" << min_col_val << endl;
    return 0;
}

如果用原生指针实现动态数组,逻辑完全相同,只是需要手动管理内存:

// 分配内存
int** arr = new int*[rows];
for (int i = 0; i < rows; ++i) {
    arr[i] = new int[cols];
}

// ... 上述遍历逻辑 ...

// 释放内存
for (int i = 0; i < rows; ++i) {
    delete[] arr[i];
}
delete[] arr;

二、解决访问违例异常的建议

你遇到的0xC0000005错误是数组下标越界导致的内存访问违规,结合你的描述和代码片段,给你几个具体的排查和解决方向:

1. 修正数组维度的对应关系

你的变量是Products(产品数)和SalesPerson(销售人员数),正常业绩数组应该是每行对应一个销售人员,每列对应一个产品,也就是维度为[SalesPerson][Products]。但你写的LowPerformance = sales[Products][0];是用产品数当行下标——行的总数是SalesPerson,行下标只能在0到SalesPerson-1之间,用Products当行下标必然越界!

比如如果有5个销售人员、10个产品,行下标最大是4,你用10当行下标,肯定会访问到数组外的内存,触发异常。

2. 检查动态数组的分配是否正确

如果用原生指针分配数组,必须保证行和列的顺序和访问逻辑一致。正确的分配方式应该是:

int** sales = new int*[SalesPerson]; // 先分配销售人员数量的行
for (int i = 0; i < SalesPerson; ++i) {
    sales[i] = new int[Products]; // 每行对应产品数量的列
}

如果搞反了行和列的分配顺序,后续访问也会出现越界问题。

3. 确认变量已正确初始化

看你的代码片段,int Products, SalesPerson;之后是输入提示,但要确保用户输入后这两个变量被正确赋值。如果SalesPerson没被赋值,它会是一个随机垃圾值,导致数组分配的行数错误,后续访问必然出错。

4. 用vector替代原生指针

原生指针的动态数组很容易因为内存分配、下标越界出问题,换成vector能大幅降低这类错误:

vector<vector<int>> sales(SalesPerson, vector<int>(Products));

它不仅自动管理内存,调试时也更容易定位问题。

5. 调试时检查变量实际值

在触发异常的代码前添加打印语句,确认变量值是否符合预期:

cout << "SalesPerson: " << SalesPerson << ", Products: " << Products << endl;

比如如果SalesPerson是5,你却访问sales[10][0],就能立刻发现下标越界的问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:54:21