Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Malloc运行时错误_C_Malloc_Runtime Error_Dynamic Memory Allocation - Fatal编程技术网

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*
执行显式指针强制转换