У меня есть следующий код, в котором, когда я пытаюсь освободить память malloc'ed, я иногда получаю ошибку сегментации. Эта ошибка возникает только при освобождении памяти, связанной с некоторыми из моих членов структуры (только по прозвищу и за ее пределами), что означает, что я никогда не получаю ошибку сегментации для free(player->name)
, но примерно в половине случаев я получаю ошибки сегментации от двух других разрядов (видя, как инструменты является нулевым, это не имеет никакого эффекта)Случайная ошибка сегментации на указателях malloc'd
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);
}
Любой помощь в решении этого будет оценена.
Скорее всего, вы будете вне границ некоторого массива, записывая в течение некоторого адреса и получить ошибку, когда вы освободив. Вы должны попробовать отладки и, возможно, еще более удобный запуск 'valgrind', чтобы увидеть, что происходит не так и где. – Shahbaz