#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%sn",buf++);
free(buf);
buf=NULL;
system("pause");
return 0;
}
执行期间的消息框 free(buf):
Windows 在 clean_rough_draft.exe 中触发了断点。
这可能是由于堆损坏,这表明 clean_rough_draft.exe或其加载的任何 DLL。
这也可能是由于用户在 F12 时按下 F12 clean_rough_draft.exe有重点。
输出窗口可能包含更多诊断信息。
原因是什么?我只想释放内存而不会泄漏...
因为您正在递增buf
,然后尝试free()
它。当你free()
它时,它不再指向malloc()
返回的内容。
另外(这与你的崩溃无关),你可能应该检查buf[0] != ' '
而不是buf[0] != NULL
。
问题是"printf("%s",buf++);"即您正在更改 由"malloc"即"buf"返回的基址。对于"免费();" API 你必须传递"malloc"返回的基址 应用程序接口。
替代或解决方案是:有一个额外的字符指针并临时存储"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 != ' ')
printf("n%sn",buf++);
/* restoring the base address back to buf */
buf = temp;
free(buf);
buf=NULL;
temp = NULL;
}
return 0;
}