不确定下面的代码有什么问题,为什么它给了我错误"被释放的指针没有被分配"。使用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;
}
答案 0 :(得分:3)
行
char outputMessage[50] = "";
messagePtr = outputMessage;
创建char[50]
并为messagePtr
分配该数组的地址,从而删除指向 malloc
内存的指针 。因此,后续free
调用会尝试释放messagePtr
,而不是malloc
分配的内存。不仅如此,malloc
内存将丢失,因为你丢失了对它的所有引用(即指针)。
我不完全确定你要通过messagePtr = outputMessage
完成什么,所以我不能给你一个解决这个问题的暗示 - 除了不重新分配由 malloc
之前> free
。
注意:
void*
返回malloc
转换为其他指针类型。有一个隐含的转换。阅读why not to cast the return value of malloc
。答案 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(根据示例)。