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 回答