Случайная ошибка сегментации на указателях malloc'd

У меня есть следующий код, в котором всякий раз, когда я пытаюсь освободить память, занятую malloc, я иногда получаю ошибку сегментации. Эта ошибка возникает только при освобождении памяти, связанной с некоторыми из моих членов структуры (только для псевдонима и далее), что означает, что я никогда не получаю ошибку сегментации для free(player->name), но примерно половину времени я получаю ошибки сегментации от двух других освобождений (видя, что инструменты нулевые, это не имеет никакого эффекта)

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);
}

Любая помощь в решении этого будет принята с благодарностью.

2 ответа

Решение

Ваша (главная) проблема в этой строке:

Player one=malloc(sizeof(Player));

Player определяется как указатель на структуру player_t, поэтому вы не резервируете достаточно памяти для сохранения всей структуры. Достаточно только для первого указателя (name) именно поэтому вы видите сбой при доступе nickname,

Пытаться:

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

Что, если nickname длиннее чем name?

Другие вопросы по тегам