user-0 提问: 这段代码运行的时候为什么会提示重复释放p的空间呢？

回复:
user: user-1
content: #include<stdio.h> #include<stdlib.h>  #define maxVertNum 100  typedef struct node{     int adjvert;     struct node *next; }edgeNode;//边结构体  typedef struct{     char vertinfo;     edgeNode *firstedge; }vertNode;//顶点结构体  typedef struct{     vertNode verts[maxVertNum];     int vertNum,edgeNum;  //顶点数和边数 }ALGraph; //图结构体  void creatGraph(ALGraph *G,int flag){     int i,j,p,q;     edgeNode *s;     printf("请输入顶点数和边数：");     scanf("%d %d",&G->vertNum,&G->edgeNum);     for(i=0;i<G->vertNum;i++){  //初始化顶点表         getchar();         printf("请输入第%d个顶点信息：",i+1);         G->verts[i].vertinfo=getchar();         G->verts[i].firstedge=NULL;     }     for(j=0;j<G->edgeNum;j++){  //初始化边表         printf("请输入相连接的顶点信息：");  //0 1         scanf("%d%d",&p,&q);         s=(edgeNode*)malloc(sizeof(edgeNode));         s->adjvert=q;         s->next = G->verts[p].firstedge;         G->verts[p].firstedge=s;         if(flag==0){//若为无向图则1 0 添加             s=(edgeNode *)malloc(sizeof(edgeNode));             s->adjvert=p;             s->next=G->verts[q].firstedge;             G->verts[q].firstedge=s;         }     } } void printGraph(ALGraph *G){     int i;     for(i=0;i<G->vertNum;i++){         printf("%d %c   ",i,G->verts[i].vertinfo);         while(1){             if(G->verts[i].firstedge==NULL){                 printf("∧");                 break;             }             printf("%d->",G->verts[i].firstedge->adjvert);             G->verts[i].firstedge=G->verts[i].firstedge->next;         }         printf("\n");     } } //void main(){ int main() {     int flag;     ALGraph *G;     printf("该图是否为有向图？ 是1/否0\n");     scanf("%d",&flag);     G=(ALGraph *)malloc(sizeof(ALGraph));     creatGraph(G,flag);     printGraph(G);     printGraph(G); }#include<stdio.h> #include<stdlib.h>  #define maxVertNum 100  typedef struct node{     int adjvert;     struct node *next; }edgeNode;//边结构体  typedef struct{     char vertinfo;     edgeNode *firstedge; }vertNode;//顶点结构体  typedef struct{     vertNode verts[maxVertNum];     int vertNum,edgeNum;  //顶点数和边数 }ALGraph; //图结构体  void creatGraph(ALGraph *G,int flag){     int i,j,p,q;     edgeNode *s;     printf("请输入顶点数和边数：");     scanf("%d %d",&G->vertNum,&G->edgeNum);     for(i=0;i<G->vertNum;i++){  //初始化顶点表         getchar();         printf("请输入第%d个顶点信息：",i+1);         G->verts[i].vertinfo=getchar();         G->verts[i].firstedge=NULL;     }     for(j=0;j<G->edgeNum;j++){  //初始化边表         printf("请输入相连接的顶点信息：");  //0 1         scanf("%d%d",&p,&q);         s=(edgeNode*)malloc(sizeof(edgeNode));         s->adjvert=q;         s->next = G->verts[p].firstedge;         G->verts[p].firstedge=s;         if(flag==0){//若为无向图则1 0 添加             s=(edgeNode *)malloc(sizeof(edgeNode));             s->adjvert=p;             s->next=G->verts[q].firstedge;             G->verts[q].firstedge=s;         }     } } void printGraph(ALGraph *G){     int i;     for(i=0;i<G->vertNum;i++){         printf("%d %c   ",i,G->verts[i].vertinfo);         while(1){             if(G->verts[i].firstedge==NULL){                 printf("∧");                 break;             }             printf("%d->",G->verts[i].firstedge->adjvert);             G->verts[i].firstedge=G->verts[i].firstedge->next;         }         printf("\n");     } } //void main(){ int main() {     int flag;     ALGraph *G;     printf("该图是否为有向图？ 是1/否0\n");     scanf("%d",&flag);     G=(ALGraph *)malloc(sizeof(ALGraph));     creatGraph(G,flag);     printGraph(G);     printGraph(G); } 供参考～

user: user-1
content: malloc返回的是地址值，即申请的空间的首地址，而free的参数就是这个地址值，所以只要给对了地址值，在任何地方都是可以释放的。 很明显p是释放了两次。

user: user-2
content: 是reset里面free了一次，外面又free了一次

user: user-0
content: 我知道了 我想实现的操作是改变P的值  但是在函数reset()做的工作实际上只是改变了形参p的值