C Malloc Run-Ошибка - PullRequest
       27

C Malloc Run-Ошибка

1 голос
/ 15 декабря 2010

У меня есть следующий фрагмент кода:

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 ]

11 голосов
/ 15 декабря 2010

Вы делаете:

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

что неверно. Вы не должны использовать sizeof так, как вы использовали. Вам нужно:

personp->first = malloc(strlen(first) + 1);
2 голосов
/ 15 декабря 2010

Почему вы бросаете человека в песню?

person *personp = (song*) malloc(sizeof(struct person));
1 голос
/ 16 декабря 2010

И, между прочим, есть функция, которая делает то, что вы хотите, она 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 квалификаторы к сигнатуре функции, поскольку передаваемые строки только читаются и не изменяются. Это дает немного больше информации программисту, который будет использовать эту функцию в будущем. Он будет знать, что может безопасно передавать свои буферы и постоянные строки, не беспокоясь о том, что функция может взорваться.

0 голосов
/ 15 декабря 2010

приведение к 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 прошло успешно

...