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 に答える