我的函数上有两个“ free(t)”。当我调用该函数并转到第一个free(t)时,一切正常,然后该函数自我调用,然后在代码底部的free(t)中发生分段失败。为什么会这样?以及为什么第一个“ free(t)”不会导致分割失败和第二结果?谢谢
char c[50];
int b, j=0, d=0, e=0;
PLAYER *pt1;
MANAGER *pt2;
t=malloc(24*sizeof(TEAM));
tfile=fopen("team.txt", "r");
while(fscanf(tfile, "%d %s %d %d %d%c", &t[j].tablep, t[j].initials, &t[j].birth.day, &t[j].birth.month, &t[j].birth.year)!=EOF){
fgets(t[j].name, 50, tfile);
t[j].name[strlen(t[j].name)-1]='\0';
j++;
}
fclose(tfile);
t[j].name[0]=0;
j=0;
while(t[j].name[0]!=0){
printf("\t%i. %s\n", j+1, t[j].name);
j++;
}
do{
printf("What is the team of the player:");
scanf(" %c", &b);
b=b-48;
if(b<1 || b>j+1){
printf("Invalid choice. Try again.\n");
teamlists(a);
}
}while(b<1 || b>j);
j=0;
if(a==2){
}
else{ //(a==3)
pt2=malloc(sizeof(MANAGER));
memcpy(pt2, m, sizeof(*pt2));
m=malloc(24*sizeof(MANAGER));
reader(3);
while(m[j].name[0]!=0){
if(strcmp(m[j].team, t[b-1].name)==0){
do{
printf("This team already have a manager.\nEnter: \t1. to choose another team \t2. to return to menu ");
scanf(" %c", &e);
e=e-48;
if(e!=1 && e!=2)
printf("Invalid choice. Try again.\n");
if(e==1 || e==2){
free(t);
free(m);
}
if(e==1){
m=malloc(sizeof(MANAGER));
memcpy(m, pt2, sizeof(*m));
teamlists(a);
}
if(e==2){
main();
free(pt2);
}
}while(e!=1 && e!=2);
}
j++;
}
free(m);
memcpy(m, pt2, sizeof(*m));
strcpy(m->team, t[b-1].name);
free(t);
free(pt);
}
}
答案 0 :(得分:2)
7.22.3.3 The free function, paragraph 2 of the C standard状态:
free函数使ptr指向的空间被释放,即可以用于进一步分配。如果ptr是空指针,则不执行任何操作。否则,如果参数与先前由内存管理函数返回的指针不匹配,或者如果已通过调用free或realloc释放空间,则该行为是不确定的。
您通过释放两次相同的指针来调用未定义的行为。
您的症状是致命的分段违反行为,会杀死您的程序。