未在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 = 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;
}