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

执行期间的消息框 free(buf):

Windows 在 clean_rough_draft.exe 中触发了一个断点。

这可能是由于堆损坏,这表明 clean_rough_draft.exe 或其已加载的任何 DLL 中存在错误。

这也可能是由于用户在 clean_rough_draft.exe 获得焦点时按 F12。

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

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

4

2 回答 2

4

因为你正在增加buf,然后尝试free()它。到你的free()时候,它不再指向malloc()返回的内容。

另外(这与您的崩溃无关),您可能应该检查buf[0] != '\0'而不是buf[0] != NULL.

于 2012-12-12T02:59:40.677 回答
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;
    }
于 2012-12-12T03:38:25.103 回答