0

次のコードがあります。このコードでは、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);
}

これを解決するための助けをいただければ幸いです。

4

2 に答える 2

2

あなたの(主な)問題は次の行にあります:

Player one=malloc(sizeof(Player));

Player は player_t 構造体へのポインターとして定義されているため、構造体全体を保持するのに十分なメモリを確保していません。最初のポインタ () に対してのみ十分であるため、nameアクセス時にクラッシュが発生しnicknameます。

試す:

Player one=malloc(sizeof(struct player_t));
于 2013-04-12T15:17:48.997 に答える
1
one->nickname=malloc(strlen(name)+1);
...
strcpy(one->nickname,nickname);

nicknameが よりも長い場合はどうなりnameますか?

于 2013-04-12T15:15:55.513 に答える