C语言 内存释放期间的运行时堆异常


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

相关内容

  • 没有找到相关文章

最新更新