2013-04-12 2 views
0

malloc의 메모리를 해제하려고 할 때마다 가끔씩 세그먼테이션 오류가 발생하는 다음 코드가 있습니다. 이 오류는 내 구조체 멤버 중 일부와 연관된 메모리를 해제 할 때만 발생하며 (별명과 그 이후에만), free(player->name)에 대한 세분화 오류를 결코 얻지 못한다는 것을 의미합니다. 그러나 절반 정도 시간이 지나면 다른 두 개의 해제에서 세분화 오류가 발생합니다 악기가 null의 경우,이 다음에malloc 된 포인터에 대한 가끔씩의 세그먼트 화 오류

typedef struct player_t { 
    char * name; 
    char * nickname; 
    Instrument * instruments; 
    int instrumentAmount; 
} * Player; 

Player playerCreate(const char* name, const char* nickname, 
int maxInstruments) { 
    Player one=malloc(sizeof(Player)); 
    if(one==NULL || !checkLegalName(name)|| !checkLegalName(nickname) || maxInstruments<=0) { 
     return NULL; 
    } 

    one->name=malloc(strlen(name)+1); 
    one->nickname=malloc(strlen(name)+1); 

    if(!one->name || !one->nickname) { 
     playerDestroy(one); 
     return NULL; 
    } 

    strcpy(one->name,name); 
    strcpy(one->nickname,nickname); 
    one->instrumentAmount=maxInstruments; 
    one->instruments=NULL; 
    return one; 
} 

) 효과가 없습니다 :이 해결에 어떤 도움을 주시면 감사하겠습니다

void playerDestroy(Player player) { 
    if(!player) { 
     return; 
    } 

    free(player->name); 
    free(player->nickname); // this is where it happens. 
    free(player->instruments); 
    free(player); 
} 

.

+0

대부분의 아마 당신이 어떤 배열의 경계의 외출 일부 주소를 통해 작성하고 자유롭게하는 오류가 있습니다. 당신은 디버깅을 시도해야하고 아마도 더 편리하게'valgrind'를 실행하여 무엇이 잘못되었는지 그리고 어디에 있는지 볼 수 있습니다. – Shahbaz

답변

2

귀하 (main-) 문제는이 라인에 있습니다 플레이어가 player_t 구조체에 대한 포인터로 정의되고, 그래서 당신은 전체 구조를 유지하기 위해 충분한 메모리를 확보하지 않는

Player one=malloc(sizeof(Player)); 

. 첫 번째 포인터 (name) 만 있으면 충분하므로 nickname에 액세스 할 때 크래시가 표시됩니다.

시도 :

Player one=malloc(sizeof(struct player_t)); 
+0

좋은 캐치! (+1) – nneonneo

+0

감사합니다. – Thongurf

+1

많은 사람들이 typedef 안에 숨겨진 포인터 타입을 좋아하지 않고'toto * x = malloc (sizeof * x)'라는 관용구를 사용하여 공간을 할당하는 이유입니다. –

1
one->nickname=malloc(strlen(name)+1); 
... 
strcpy(one->nickname,nickname); 

무엇 nickname 경우는 더 이상 name보다?

+0

고마워, 고쳐 주셔서 감사합니다 :) – Thongurf