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

基于邻接矩阵的DFS程序无法进入main函数运行,求排查

问题诊断与修复

你的程序根本无法进入main函数就终止,核心原因是全局静态存储区的内存溢出:

你定义的MGraph结构体包含一个int arc[1000][1000]的二维数组,单个这样的数组就占用了1000*1000*4=4,000,000字节(约4MB),再加上全局的visited[1000]和结构体里的vexs[1000],总静态内存占用超过了很多编译环境默认的静态存储区上限,导致程序在加载阶段就无法完成全局变量的内存分配,直接崩溃退出,根本执行不到main函数的代码。

修复方案

方案1:动态分配邻接矩阵

把结构体中的静态二维数组改成指针,在运行时根据实际顶点数动态分配内存,避免静态存储区溢出:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int visited[1000];

typedef struct MGraph {
    int vexs[1000];
    int **arc;  // 改为指针,动态分配
    int numVertexes, numEdges;
} MGraph;

// DFS改为传结构体指针,避免拷贝大对象
void DFS(MGraph *G, int i)
{
    visited[i] = 1;
    for (int j = 0; j < G->numVertexes; j++)
        if (visited[j] == 0 && G->arc[i][j] == 1)
            DFS(G, j);
}

// 同样传指针
void DFSTrverse(MGraph *G)
{
    int num = 0;
    for (int i = 0; i < G->numVertexes; i++)
        visited[i] = 0;
    for (int i = 0; i < G->numVertexes; i++)
    {
        if (visited[i] == 0)
        {
            num++;
            DFS(G, i);
        }
    }
    printf("%d", num - 1);
}

int main(void)
{
    int i, j, k;
    MGraph g;
    scanf("%d %d", &g.numVertexes, &g.numEdges);

    // 动态分配二维邻接矩阵
    g.arc = (int**)malloc(g.numVertexes * sizeof(int*));
    for (i = 0; i < g.numVertexes; i++) {
        g.arc[i] = (int*)malloc(g.numVertexes * sizeof(int));
        // 初始化所有元素为0
        memset(g.arc[i], 0, g.numVertexes * sizeof(int));
    }

    for (i = 0; i < g.numEdges; i++)
    {
        scanf("%d %d", &j, &k);
        g.arc[j-1][k-1] = 1;
    }
    DFSTrverse(&g);

    // 释放动态分配的内存(OJ环境可省略,实际工程必须添加)
    for (i = 0; i < g.numVertexes; i++) {
        free(g.arc[i]);
    }
    free(g.arc);
    return 0;
}

方案2:缩小静态数组大小

如果题目保证顶点数远小于1000,比如最多200个顶点,可以直接把结构体中的arc[1000][1000]改为arc[200][200],同时调整visited和vexs的大小,减少静态内存占用。

额外优化

  • 原代码中DFS和DFSTrverse函数传的是MGraph的副本,会拷贝整个大结构体,效率极低且浪费内存,改为传指针可以大幅提升性能。
  • 动态分配的内存记得在程序结束前释放,避免内存泄漏(在线判题环境通常不需要,但实际开发必须遵守)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 02:40:40