基于邻接矩阵的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
相关产品推荐
相关产品推荐

