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

时间:2016-07-23 09:51:23

标签: c clang

不确定下面的代码有什么问题,为什么它给了我错误"被释放的指针没有被分配"。使用clang。

#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;
}

3 个答案:

答案 0 :(得分:3)

char outputMessage[50] = "";
messagePtr = outputMessage;

创建char[50]并为messagePtr分配该数组的地址,从而删除指向 malloc 内存的指针 。因此,后续free调用会尝试释放messagePtr,而不是malloc分配的内存。不仅如此,malloc内存将丢失,因为你丢失了对它的所有引用(即指针)。

我不完全确定你要通过messagePtr = outputMessage完成什么,所以我不能给你一个解决这个问题的暗示 - 除了不重新分配由 malloc 之前> free

注意:

答案 1 :(得分:3)

您已将outputMessage分配给messagePtr,这是一个数组,并转换为指向数组第一个元素的指针,因此messagePtr不再指向通过malloc()或其家人。

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

请注意,他们说you shouldn't cast the result of malloc() in C

您的一些选择是:

1。停止使用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;
}

2。 之前释放缓冲区

#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;
}

3。使用strcpy()复制字符串。

#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;
}

答案 2 :(得分:0)

messagePtr = (char *)malloc(sizeof(char) * 800);

使messagePtr指向Heap中malloc分配800个字符(例如1005)的位置。必须释放这个位置。

messagePtr = outputMessage;

使messagePtr指向Stack中的位置,其中50个字符自动分配(例如505)。

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