分段无法释放指针

时间:2019-01-24 23:55:12

标签: c

我的函数上有两个“ 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);   
}

}

1 个答案:

答案 0 :(得分:2)

7.22.3.3 The free function, paragraph 2 of the C standard状态:

  

free函数使ptr指向的空间被释放,即可以用于进一步分配。如果ptr是空指针,则不执行任何操作。否则,如果参数与先前由内存管理函数返回的指针不匹配,或者如果已通过调用free或realloc释放空间,则该行为是不确定的

您通过释放两次相同的指针来调用未定义的行为。

您的症状是致命的分段违反行为,会杀死您的程序。