C Malloc运行时错误
我有以下代码片段:C Malloc运行时错误,c,malloc,runtime-error,dynamic-memory-allocation,C,Malloc,Runtime Error,Dynamic Memory Allocation,我有以下代码片段: 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
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有关。你为什么要把一个人变成一首歌
person *personp = (song*) malloc(sizeof(struct person));
你为什么要把一个人编成一首歌
person *personp = (song*) malloc(sizeof(struct person));
你可以:
personp->first = (char*) malloc(sizeof(strlen(first) + 1));
这是不正确的。您不应该像以前那样使用sizeof
。你需要:
personp->first = malloc(strlen(first) + 1);
你可以:
personp->first = (char*) malloc(sizeof(strlen(first) + 1));
这是不正确的。您不应该像以前那样使用sizeof
。你需要:
personp->first = malloc(strlen(first) + 1);
投给
人
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
是否成功向个人
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
是否成功,顺便说一句,有一个函数可以做您想做的事情,它是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
限定符,因为传递的字符串只被读取而不被修改。这为将来使用该函数的程序员提供了更多的信息。他知道他可以安全地通过缓冲区和常量字符串,而不用担心函数可能会爆炸。顺便说一句,有一个函数可以做你想做的事情,它是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
限定符,因为传递的字符串只被读取而不被修改。这为将来使用该函数的程序员提供了更多的信息。他将知道他可以安全地传递缓冲区和常量字符串,而不用担心函数可能会崩溃。Style:为什么要显式地强制转换从malloc
返回的指针?在C语言中,这是不必要的,甚至可以隐藏问题。什么是歌曲?你在哪里释放你的指针?好奇:它为什么隐藏问题?很抱歉这首歌。我修改了问题,但没有解决。很抱歉。请不要忘记检查malloc成功分配如果您忘记包含malloc
的原型,其返回值将作为int
而不是void*
。这样,您可能会丢失返回指针的字节。在C中,void*
可以指定给任何其他数据指针类型。在C(不是C++)中,void*
可以隐式转换为任何其他指针类型,例如从malloc
返回的void*
会发生什么。但是,如果类型已更改(如更改了指针的类型),但忘记更改强制转换,则可能会禁止不兼容的类型分配
警告。更不用说,这只是更不必要的打字DStyle:为什么要显式地强制转换从malloc
返回的指针?在C语言中,这是不必要的,甚至可以隐藏问题。什么是歌曲?你在哪里释放你的指针?好奇:它为什么隐藏问题?很抱歉这首歌。我修改了问题,但没有解决。很抱歉。请不要忘记检查malloc成功分配如果您忘记包含malloc
的原型,其返回值将作为int
而不是void*
。这样,您可能会丢失返回指针的字节。在C中,void*
可以指定给任何其他数据指针类型。在C(不是C++)中,void*
可以隐式转换为任何其他指针类型,例如从malloc
返回的void*
会发生什么。但是,如果类型已更改(如更改了指针的类型),但忘记更改强制转换,则可能会禁止不兼容的类型分配
警告。更不用说,这只是更不必要的打字接得好,我掩盖了这一点。他似乎真的很幸运,这件事没有在make_person
中爆发,因为他似乎只在免费期间遇到问题。仍然不必从C中的malloc
返回的void*
执行显式指针强制转换哦,接得好,我掩盖了这一点。他似乎真的很幸运,这件事没有在make_person
中爆发,因为他似乎只在免费期间遇到问题。仍然不必从C中的malloc
返回的void*
执行显式指针强制转换