munmap_chunk():指针无效

时间:2015-08-20 12:40:36

标签: c

我发现程序中的错误,并决定编写一个简单的错误,这将有助于我了解正在发生的事情。这是:

#include <stdio.h>
#include <stdlib.h>

char * first()
{
    char * word = malloc(sizeof(char) * 10);
    word[0] = 'a';
    word[1] = 'b';
    word[2] = '\0';
    return word;
}

char * second ()
{
    char * word = malloc(sizeof(char) * 10);
    word = "ab";
    return word;
}

int main ()
{
    char * out = first();
    printf("%s", out);
    free(out);
    out = second();
    printf("%s", out);
    free(out);
    return 0;
}

first()功能正常运行,但second()(完全是free(out))会产生错误:

  <。> ./a.out'中的错误:munmap_chunk():无效指针:0x0000000000400714 ***   ababAborted(核心倾销)

我不明白为什么第一个功能是正确的,但第二个功能不正确。谁能解释为什么?

2 个答案:

答案 0 :(得分:31)

在函数second()中,赋值word = "ab";会为word指定一个新指针,覆盖通过malloc()获得的指针。当您稍后在指针上调用free()时,程序会崩溃,因为您将指针传递给free(),但尚未通过malloc()获取。

分配字符串文字无法像您想象的那样复制其内容。要复制字符串文字的内容,请使用strcpy()

strcpy(word, "ab");

答案 1 :(得分:10)

在函数char * second

 char * word = malloc(sizeof(char) * 10);
 word = "ab";

第二个语句word = "ab";word更改为指向远离已分配的内存。您不是将字符串"ab"复制到malloc分配的堆区域。 / p>

对于free,未由malloc或类似功能分配的内存会导致程序崩溃。

  

尝试释放无效指针(指向未由calloc,malloc或realloc分配的内存块的指针)可能会影响后续分配请求并导致错误。

你应该在这里strcpy使用其他人的建议。