Unhandled exception in Graph.exe:0xC0000005:Access Violation

来源:百度知道 编辑:UC知道 时间:2024/05/27 13:21:25
Status CreateDN(MGraph *g,int flag)
{
int i,j;

ArcNode *p;
(*g).vexnum=G.vexnum;
(*g).arcnum=G.arcnum;
for(i=0;i<(*g).vexnum;++i) /* 构造顶点向量 */
strcpy((*g).vexs[i],G.vertices[i].city);
puts(G.vertices[i].city);
for(i=0;i<(*g).vexnum;++i) /* 初始化邻接矩阵 */
for(j=0;j<(*g).vexnum;++j)
{
(*g).arcs[i][j].adj=INFINITY; /* 网 */
}
p=(ArcNode*)malloc(sizeof(ArcNode));
for(i=0;i<(*g).arcnum;++i)
{/* 定义ArcNode *p */

p=G.vertices[i].firstarc;
if(p)
{
for(;p!=NULL;p=p->nextarc)
{
j=p->adjvex;
switch(flag)
{
case 0: (*g).arcs[i][j].adj=p->Train.Distance;
break;
case 1: (*g).arcs[i][j].adj=p->Air.Distance;
break;
case 2: (*

简单看了下,程序风格还不错,只是看得出来,你比较害怕使用指针阿,我看了下提几个建议:对你可能会有帮助:

第一:函数参数要检查,尤其是指针参数,必须检查,否则就容易出现你现在的问题了:0xC0000005:Access Violation (使用指针之前一定要检查它是否为空)
比如说你的Status CreateDN(MGraph *g,int flag)
第一件事,检查下你传入的参数是否合法,可以这样
{
if (g == NULL) return;
}

还有一个问题,你(*g).vexnum这个用法比较别扭,直接用g->vexnum就可以了。这反映出你比较怕指针

第二:malloc了一块内存,注意free。

你可以看下林锐博士写的<<高质量c++编程>>,对你有很大帮助。

因为第二次循坏p=p->nextarc了,那可能p->nextarc指向的内存你没有控制好,可能是不能读写的。你可以调式看这个地址里面的内容阿,是否是你所要的东西。