#include <stdlib.h>
#include <stdio.h>
int main()
{
static char* buf;
buf = (char*)malloc(20*sizeof(char));
scanf("%s",buf);
while(buf[0] != NULL)
printf("\n%s\n",buf++);
free(buf);
buf=NULL;
system("pause");
return 0;
}
执行期间的消息框空闲(buf):
Windows已在clean_rough_draft.exe中触发了断点。
这可能是由于堆的损坏,这表明存在错误 clean_rough_draft.exe或它加载的任何DLL。
这也可能是由于用户在按下F12时 clean_rough_draft.exe具有焦点。
输出窗口可能包含更多诊断信息。
原因是什么?我只想释放内存而不泄漏...
答案 0 :(得分:4)
因为您正在递增buf
,然后尝试free()
它。当您free()
时,它不再指向malloc()
返回的内容。
此外(这与您的崩溃无关),您可能应该检查buf[0] != '\0'
而不是buf[0] != NULL
。
答案 1 :(得分:1)
问题是“ printf(”\ n%s \ n“,buf ++); ”即你正在改变 “malloc”返回的基地址,即“buf”。对于“ free(); ” api你必须传递“ malloc ”返回的基地址 API。
替代或解决方案是:有一个额外的字符指针并暂时存储“ malloc ”返回的基地址,如果是动态的 分配成功。在释放分配的内存的同时重新存储它。
#include<stdio.h>
#include<stdlib.h>
int main()
{
static char* buf;
static char *temp;
buf = (char*)malloc(20*sizeof(char));
/* Better to check for the allocation failure */
if(!buf)
{
printf("Failed to allocate memory \n");
exit(EXIT_FAILURE);
}
else
{
temp = buf;
scanf("%s",buf);
while(*buf != '\0')
printf("\n%s\n",buf++);
/* restoring the base address back to buf */
buf = temp;
free(buf);
buf=NULL;
temp = NULL;
}
return 0;
}