未在C中分配要释放的指针

未在C中分配要释放的指针,c,clang,C,Clang,不确定下面的代码有什么问题,以及为什么它会给我错误“未分配被释放的指针”。使用叮当声 #include <stdio.h> #include <string.h> #include <stdlib.h> static char * messagePtr; int main() { messagePtr = (char *)malloc(sizeof(char) * 800); if(messagePtr == NULL) {

不确定下面的代码有什么问题,以及为什么它会给我错误“未分配被释放的指针”。使用叮当声

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

static char * messagePtr;

int main()
{

    messagePtr = (char *)malloc(sizeof(char) * 800);
    if(messagePtr == NULL) {
       printf("Bad malloc error\n");
       exit(1);
    }


    // //gameLoop();
    char outputMessage[50] = "";
    messagePtr = outputMessage;

    free(messagePtr);
    messagePtr = NULL;

    return 0;
}
#包括
#包括
#包括
静态字符*messagePtr;
int main()
{
messagePtr=(char*)malloc(sizeof(char)*800);
if(messagePtr==NULL){
printf(“错误的malloc错误\n”);
出口(1);
}
////gameLoop();
char outputMessage[50]=“”;
messagePtr=输出消息;
免费(messagePtr);
messagePtr=NULL;
返回0;
}
这些行

char outputMessage[50] = "";
messagePtr = outputMessage;
创建一个
char[50]
并为
messagePtr
分配该数组的地址,从而删除指向
malloc
ed内存的指针。因此,连续的
free
调用尝试释放
messagePtr
,而不是
malloc
分配的内存。不仅如此,
malloc
ated内存将丢失,因为您已经丢失了对它的所有引用(即指针)


我不完全确定你想通过
messagePtr=outputMessage
实现什么,所以我不能真正给你解决这个问题的提示-除了
之前不要重新分配malloc返回的指针


注:

  • 您不需要将
    malloc
    返回的
    void*
    强制转换为其他指针类型。这是一个隐含的转换。阅读
使messagePtr指向堆中malloc分配了800个字符的位置(例如1005)。必须释放此位置

messagePtr = outputMessage;
使messagePtr指向堆栈中自动分配50个字符的位置(例如505)

无法使用free释放自动分配。当变量的作用域结束时,它们将自动解除分配。
在自动分配的内存上调用free是一个错误。必须在位置1005上调用free(根据示例)。

您分配的
outputMessage
,它是一个数组,并被转换为指向数组第一个元素的指针,指向
messagePtr
,因此
messagePtr
不再指向通过
malloc()
或其系列分配的内容

通过内存管理函数(如
malloc()
)传递非
NULL且未分配的内容将调用未定义的行为。(7.22.3.3自由功能)

注意,他们说

您的一些选择包括:

一,。停止使用
malloc()
分配将被丢弃的缓冲区

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

static char * messagePtr;

int main()
{

    // //gameLoop();
    char outputMessage[50] = "";
    messagePtr = outputMessage;

    messagePtr = NULL;

    return 0;
}

messagePtr=outputMessage=不再指向先前分配的(现已泄漏)动态内存。如果你看不到这一点,你需要回顾一下你正在使用的任何书籍或教程中关于动态内存管理的部分。你不需要C中malloc的cast-最好是删除它记住:你不“释放指针”,你释放它指向的内存!(我真的很想和那些散布这种胡说八道的老师进行一次严肃的谈话——这将大大减少混乱)strcpy()是我正在寻找的函数。我看了很多教程,在网上和这里搜索了很多,发现解决方案可能很简单,我就是找不到。谢谢大家的回答。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

static char * messagePtr;

int main()
{

    // //gameLoop();
    char outputMessage[50] = "";
    messagePtr = outputMessage;

    messagePtr = NULL;

    return 0;
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

static char * messagePtr;

int main()
{

    messagePtr = malloc(sizeof(char) * 800);
    if(messagePtr == NULL) {
       printf("Bad malloc error\n");
       exit(1);
    }


    // //gameLoop();
    free(messagePtr);
    char outputMessage[50] = "";
    messagePtr = outputMessage;

    messagePtr = NULL;

    return 0;
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

static char * messagePtr;

int main()
{

    messagePtr = malloc(sizeof(char) * 800);
    if(messagePtr == NULL) {
       printf("Bad malloc error\n");
       exit(1);
    }


    // //gameLoop();
    char outputMessage[50] = "";
    strcpy(messagePtr, outputMessage);

    free(messagePtr);
    messagePtr = NULL;

    return 0;
}