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

时间:2012-12-12 02:55:31

标签: c memory malloc heap free

#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具有焦点。

     

输出窗口可能包含更多诊断信息。

原因是什么?我只想释放内存而不泄漏...

2 个答案:

答案 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;
    }