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

VS2019中向二维vector插入元素时触发Segmentation Fault错误

错误原因

段错误的核心原因是访问了未申请的非法内存:

  • 你声明vector<vector<int>> arr;时只创建了一个空的二维vector,内部没有任何元素,也没有分配对应大小的存储空间
  • vector的[]下标运算符不会自动扩容,你直接执行cin >> arr[i][j]相当于直接读写不存在的内存位置,触发内存访问违规,在VS下会报调试断言错误,在Linux/在线编辑器环境就会触发Segmentation Fault。
修复方法

两种常用修复方式二选一即可:

  • 方式一:初始化vector时直接指定大小
    读取完边长num之后,直接把二维vector初始化为num行、每行num个int元素的结构,之后就可以正常用下标访问:
#include <iostream>
#include <vector>
using namespace std;

int main()
{
    int num;
    cin >> num;
    // 初始化num行,每行存num个int,默认值为0
    vector<vector<int>> arr(num, vector<int>(num));

    for (int i = 0; i < num; i++)
    { 
        for (int j = 0; j < num; j++)
        {
            cin >> arr[i][j];
        }   
    }
    int ans = 0;
    for (int i = 0; i < num; i++)
    {
        for (int j = 0; j < num; j++)
        {
            ans += arr[i][j];
        }
    }

    cout << (ans == 0 ? "YES" : "NO");
    return 0;
}
  • 方式二:动态追加元素
    如果不想预先固定大小,可以在读取输入时逐行、逐元素用push_back往vector里追加内容,不要直接用下标访问未分配的位置:
#include <iostream>
#include <vector>
using namespace std;

int main()
{
    int num;
    cin >> num;
    vector<vector<int>> arr;

    for (int i = 0; i < num; i++)
    { 
        vector<int> cur_row;
        for (int j = 0; j < num; j++)
        {
            int tmp;
            cin >> tmp;
            cur_row.push_back(tmp);
        }
        arr.push_back(cur_row);
    }
    int ans = 0;
    for (int i = 0; i < arr.size(); i++)
    {
        for (int j = 0; j < arr[i].size(); j++)
        {
            ans += arr[i][j];
        }
    }

    cout << (ans == 0 ? "YES" : "NO");
    return 0;
}

注意:如果是已知固定大小的场景,第一种初始化时指定大小的方式效率更高,省去了动态扩容的额外开销。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 20:01:02