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

C++实现随机生成图矩阵时出现段错误的问题求助

问题原因
  • 核心bug出在赋值逻辑的非法内存访问:外层循环i仅完成了从0到当前i的行内存申请,当j > i时,graph[j]还未执行new操作,属于野指针,此时对graph[j][i]赋值就会触发段错误。
  • 你当前的逻辑是想生成无向图的对称矩阵,直接在遍历i行时给未初始化的j行赋值不符合内存申请的顺序。
修复方案

两种常用修改方式可选:

方案1:先完成所有内存申请再赋值

先把所有行的内存都申请完成,再遍历生成矩阵内容,从根源避免野指针问题:

#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;

const int graph_size = 4;

int main(void)
{
    bool** graph;
    srand(time(0));

    // 先申请所有行、列的内存
    graph = new bool*[graph_size];
    for(int i=0; i<graph_size; i++)
    {
        graph[i] = new bool[graph_size];
    }

    // 再生成对称矩阵内容
    for(int i=0; i<graph_size; i++)
    {
        for(int j=0; j<graph_size; j++)
        {
            if(i==j){
                graph[i][j]=false;
            }else if(i < j){ // 仅给上三角赋值,对称同步到下三角即可
                graph[i][j] = (((rand()%100)/100.0) < 0.19);
                graph[j][i] = graph[i][j]; 
            }
            cout << graph[i][j];
        }
        cout << endl;
    }

    // 手动释放堆内存避免内存泄漏
    for(int i=0; i<graph_size; i++){
        delete[] graph[i];
    }
    delete[] graph;
    return 0;
}

方案2:调整赋值逻辑,仅访问已初始化的行

如果不想提前申请所有内存,可以仅在j <= i的时候执行赋值操作,避免访问还未初始化的graph[j]内存。

额外优化建议

如果使用C++11及以上版本,推荐用vector容器代替手动申请的二级指针,内存由容器自动管理,不会出现野指针、内存泄漏等问题,开发效率更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 22:00:04