永发信息网

在函数中为啥使用结构体指针数组,为其赋值赋不上,(申请了空间),在main函数中可以赋值

答案:2  悬赏:10  手机版
解决时间 2021-02-01 04:26
  • 提问者网友:锁深秋
  • 2021-01-31 23:12
#include
#include
struct MGraph
{
char vexs[20];
int vexnum,arcnum;
int AdjMatrix[20];
};
struct
{
char adjvex;
int lowcost;
}closedge[20];
struct CSNode
{
char data;
struct CSNode *firstchild,*nextsibling;
};
int MiniSpanTree_PRIM(struct MGraph *s,char u,struct CSNode *root);
void main()
{
struct MGraph *s;
struct CSNode *root;
root=(struct CSNode *)malloc(sizeof(struct CSNode *));
s=(struct MGraph *)malloc(sizeof(struct MGraph *));
creatUDN(s);//没写地方不够,建立一个图,邻接矩阵;
MiniSpanTree_PRIM(s,s->vexs[0],root);
}
int MiniSpanTree_PRIM(struct MGraph *s,char u,struct CSNode *root)
{
struct CSNode *p,*p2,*q,*g[20];
int i,j,k,flag,m,n;
char da,fla;
for(i=0;ivexnum;i++)
{
g[i]=(struct CSNode *)malloc(sizeof(struct CS Node));
g[i]->data=s->vexs[i];//再这错误
g[i]->firstchild=NULL;g[i]->nextsibling=NULL;
}
return1;
}
将那一部分放到main函数里可以输出正确结果
谢谢!
最佳答案
  • 五星知识达人网友:舍身薄凉客
  • 2021-02-01 00:12
你的空间没释放!!
free(s);
free(root);
全部回答
  • 1楼网友:举杯邀酒敬孤独
  • 2021-02-01 01:45
你的这个代码,一些标点可能你复制错了,我改了下,creatUDN(s);我注释掉了,另外在MiniSpanTree_PRIM函数里的两个malloc参数我给去掉了星号,ubuntu10.04+gcc4.4没有报错,但不知你的main怎么写的,我没运行。 大致解释下吧,不知你的malloc是有其他用意还是马虎错了,malloc参数为所需在堆(也就是汇编的数据段)开辟的空间的字节数,例如我要开辟一个int型,那么默认的gcc int为4字节,malloc就开出4字节,(两种写法在gcc上等效malloc(4)或者malloc(sizeof(int)))。它的输出为开辟的空间的首地址,例如int开完后malloc只给出一个void*类型,为单字节指针,指向int在数据段的首地址,因为默认输出为单字节指针,也可理解为char*,因为两个指针在gcc下的默认字节数相同,所以为了后面的方便操作我们才对他进行指针类型转换,可你源程序的三个malloc里开出的不是某个struct所占的字节数的存储空间,而是struct*所占字节数的存储空间,即指针存储空间,gcc默认为8字节,然后你却把它变成相应struct来引用,可能会引用到未开辟区域,编译不会出错,但运行就不好说了,你仔细查查还有没有这种错误了
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯