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

C++用vector实现邻接矩阵时出现Segmentation Fault问题求助

为什么用vector嵌套实现邻接矩阵时会触发Segmentation Fault?

嘿,我看你在Windows下用clang++ 5.0.1搞邻接矩阵的时候碰到了段错误,而且一碰vertex_matrix就炸——这种情况十有八九是这个嵌套vector没被正确初始化,或者你访问的时候越界了。结合你提到的头文件,我给你列几个最容易踩的坑:

  • 没给嵌套vector分配足够空间
    邻接矩阵是二维结构,得先把外层vector的大小定下来,再给每个内层vector也分配空间才行。比如你有n个顶点,正确的初始化应该是这样:

    // 初始化n×n的矩阵,默认值设为0(或者用代表无穷大的数值表示无连接)
    std::vector<std::vector<int>> vertex_matrix(n, std::vector<int>(n, 0));
    

    要是你只声明了std::vector<std::vector<int>> vertex_matrix;就直接去访问vertex_matrix[i][j],那肯定炸——这时候外层vector是空的,vertex_matrix[i]本身就是越界访问,直接触发段错误。

  • 类成员的初始化时机错了
    如果vertex_matrix是你的Graph类的成员变量,得在构造函数里完成初始化,不能直接在类声明里瞎写(除非用C++11及以后的就地初始化,而且得是编译期常量)。举个正确的例子:

    class GraphMatrix {
    private:
        std::vector<std::vector<int>> vertex_matrix;
        int vertex_count;
    public:
        // 用构造函数初始化列表来搞定嵌套vector
        GraphMatrix(int n) : vertex_count(n), vertex_matrix(n, std::vector<int>(n, 0)) {}
    };
    

    要是你在类声明里写std::vector<std::vector<int>> vertex_matrix(n, ...);,这绝对是错的——类声明阶段没法用非编译期常量初始化成员,结果就是vertex_matrix根本没被正确构造,后续访问自然崩。

  • 访问时索引越界了
    就算你初始化对了矩阵,要是访问的i或者j超出了[0, vertex_count-1]的范围,照样炸。比如你的矩阵是5×5的,结果你去访问vertex_matrix[5][0],这就越界了,直接触发段错误。

  • 老版本clang的潜在bug?
    这个可能性不高,但clang++ 5.0.1是2017年的老版本了,Windows平台下的clang对C++标准库的支持可能有一些小问题。要是上面的坑你都排查过了还是不行,可以试试升级clang版本,或者换MSVC编译试试,看看是不是编译器的锅。

对了,你贴的头文件代码不全,要是能把完整的类定义和初始化代码放出来,我能更精准地帮你定位问题~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:31:33