1

次のコード スニペットがあります。

typedef struct person {
    char *first ;
    char *last ;
    char *location ;
    struct person *next_person ;
} person ;

person *make_person(char *first, char *last, char *location) {
    person *personp = (person*) malloc(sizeof(struct person));

    personp->first = (char*) malloc(sizeof(strlen(first) + 1));
    personp->last = (char*) malloc(sizeof(strlen(last) + 1));
    personp->location = (char*) malloc(sizeof(strlen(location) + 1));

    strcpy(personp->first, first);
    strcpy(personp->last, last);
    strcpy(personp->location, location);

    personp->next_person = NULL;

    return personp ;
}

それをコードの残りの部分と統合すると、実行が開始され、弾道が進みます。

*** glibc detected *** ./level1: free(): invalid next size (fast): 0x0804a188 ***

何がうまくいかないのですか?私はそれが私のmallocに関係していると感じています。

4

4 に答える 4

11

あなたがやる:

personp->first = (char*) malloc(sizeof(strlen(first) + 1));

これは正しくありません。今まで通りの使い方をしてはいけませんsizeof。必要なもの:

personp->first = malloc(strlen(first) + 1);
于 2010-12-15T16:04:08.587 に答える
2

なぜ人を歌にキャストするのですか?

person *personp = (song*) malloc(sizeof(struct person));
于 2010-12-15T16:01:00.363 に答える
1

ところで、やりたいことを実行する関数があります。それstrdupはC標準にはありませんが、ほぼすべての場所にあり、そうでない場合は最終的に2ライナーで実装できます。

person *make_person(const char *first, const char *last, const char *location) {
  person *personp = malloc(sizeof(struct person));

  personp->first       = strdup(first); 
  personp->last        = strdup(last);
  personp->location    = strdup(location);
  personp->next_person = NULL;

  return personp ;
}

編集:const渡された文字列は読み取りのみで変更されないため、関数のシグネチャに修飾子も追加しました。これにより、将来その機能を使用するプログラマーにもう少し情報が提供されます。彼は、関数が爆発することを心配することなく、バッファーと定数文字列を安全に渡すことができることを知っています。

于 2010-12-15T21:27:01.527 に答える
0

にキャストperson

person *personp = (person *) malloc(sizeof(struct person));

するなsizeof

personp->first = (char*) malloc(strlen(first) + 1);
personp->last = (char*) malloc(strlen(last) + 1);
personp->location = (char*) malloc(strlen(location) + 1);

mallocまた、成功したことを確認する必要があります

于 2010-12-15T16:11:07.577 に答える