被释放的C指针未被分配(即使我将其malloc';d,这就是这个程序所做的一切)

被释放的C指针未被分配(即使我将其malloc';d,这就是这个程序所做的一切),c,pointers,struct,malloc,C,Pointers,Struct,Malloc,我在我的mac上写了一个C程序,我做了一些基本的东西,但是我犯了这个错误。我有一个结构,里面有一个字符指针,用来保存简短的描述。在我的主类中,我创建了一个指向该结构的指针,然后在该结构中创建了另一个用于char指针的指针。当我释放结构中的char指针时,我的终端抛出一些错误消息,关于释放了一个未分配的指针。如果我把那一行注释掉,错误就不存在了,所以我很确定那是那一行。我将包括导致此奇怪问题的代码 Chair *chair = (Chair*)malloc(sizeof(Chair)); chai

我在我的mac上写了一个C程序,我做了一些基本的东西,但是我犯了这个错误。我有一个结构,里面有一个字符指针,用来保存简短的描述。在我的主类中,我创建了一个指向该结构的指针,然后在该结构中创建了另一个用于char指针的指针。当我释放结构中的char指针时,我的终端抛出一些错误消息,关于释放了一个未分配的指针。如果我把那一行注释掉,错误就不存在了,所以我很确定那是那一行。我将包括导致此奇怪问题的代码

Chair *chair = (Chair*)malloc(sizeof(Chair));
chair->color = (char*)malloc(sizeof(char)*4);
chair->color = "blue";
printf("This chair is %s", chair->color);
free(chair->color);
free(chair);
return 0;
当我搜索这个时,总是出现用户错误,比如不使用mallocing或者“双重自由错误”。我非常确定我使用了malloc,并且在这6行代码中没有明显的问题

chair->color = (char*)malloc(sizeof(char)*4);
chair->color = "blue";
要存储4个字符的字符串,需要5个字节。结尾部分额外增加1个
\0

另外,要分配字符串,应该使用
strcpy()


你有几个错误

  • 行中:

    chair->color = "blue";
    
    您正在分配
    chair->color
    以指向您没有从
    malloc
    获得的某些内存。然后,您将尝试稍后释放它

    您需要
    strcpy
    来完成您正在尝试的内容

    strcpy(chair->color, "blue");
    
  • 为了复制
    “blue”
    ,您必须有一个至少包含5个字符的字符串-4个字母和1个终止空字符。您需要使用:

    chair->color = malloc(N); // Where N > 4.
    
    不要强制转换
    malloc
    的返回值。如果你这样做,就会有问题。看

    您也不需要使用
    sizeof(char)
    。它保证为1


  • chair->color=“蓝色”
    chair->color
    按字符串文本的地址重写。(这不是malloc的地址)。我还注意到我甚至不需要malloc“字符串”。我的例子非常简单,以至于我忘记了基本的。。。我可以使用char*string=“some text”;我想我刚刚意识到这个问题。我来自C++环境,如果没有被抛出,MALOC总是给出一个空指针错误。椅子->颜色=“蓝色”;在这种环境下也是可行的。我写的C++比我意识到的多。谢谢你把它清理干净!我很高兴能帮上忙。
    chair->color = malloc(N); // Where N > 4.