You need to enable JavaScript to run this app. C++访问二维vector出现Segmentation Fault与out_of_range异常问题
优惠活动
大模型
产品
解决方案
定价
更多

C++访问二维vector出现Segmentation Fault与out_of_range异常问题

问题原因
  • 输入的行数据未存入mine数组:外层循环中创建的临时row变量存储了每行输入的字符,但循环结束后没有将row添加到mine中。你初始化vector <vector<char>> mine(n)仅给外层vector创建了n个空的char vector,每个内层vector的长度都是0,因此访问mine.at(0).at(0)时会触发越界异常。
  • 循环变量重名:外层循环变量为i,内层循环又定义了同名的i,会遮蔽外层的循环计数,属于潜在逻辑错误,可能导致循环执行异常。
  • 存在非法下标访问:vector的合法下标范围为[0, 容器长度-1],-1、超出实际数组长度的3都属于非法下标。at()成员函数会主动做边界检查,遇到非法下标直接抛出异常;[]运算符不做边界检查,遇到非法下标会直接触发段错误。
修复方案

完整修复代码

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    int m, n;
    cin >> m >> n;
    vector<vector<char>> mine;
    // 预分配外层vector空间,优化性能
    mine.reserve(m);

    for(int i = 0; i < m; i++)
    {
        vector<char> row;
        row.reserve(n);
        // 内层循环改用j作为变量名,避免遮蔽外层循环变量
        for(int j = 0; j < n; j++)
        {
            char x;
            cin >> x;
            row.push_back(x);
        }
        // 将输入完成的行数据存入二维vector
        mine.push_back(row);
    }

    // 仅访问合法范围内的下标
    if(m >= 1 && n >= 1) {
        cout << mine.at(0).at(0) << endl;
    }
    // 访问最后一个元素推荐直接调用back()方法,无需手动计算下标
    if(!mine.empty() && !mine.back().empty()) {
        cout << mine.back().back() << endl;
    }
    if(m > 3 && n > 3) {
        cout << mine.at(3).at(3) << endl;
    }

    return 0;
}

核心修改点说明

  • 外层循环每生成一行完整的row后,调用mine.push_back(row)将行数据存入二维vector,保证mine中每个内层vector都有合法数据
  • 内层循环变量改为j,避免和外层循环的i重名导致逻辑错误
  • 所有下标访问前先判断容器长度是否符合要求,避免非法下标访问。如果需要访问容器最后一个元素,直接调用back()成员函数即可,不要使用-1作为下标
  • 可选优化:初始化时直接指定vector大小vector<vector<char>> mine(m, vector<char>(n)),后续可以直接用下标赋值,无需调用push_back

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 14:54:01