2016-04-16 39 views
1

フリーズの仕組みがわかりません。私はメモリを2回解放しようとしたときにこれが起こることを知っています。しかし、これは本当に私を困惑させています。munmap_chunk():無効なポインタエラー

私はコードの関連部分を投稿しようとしました。

FILE* file = fopen(path, "r"); 
if (file == NULL) 
{ 
    error(500); 
    return; 
} 

// load file's content 
BYTE* content; 
size_t length; 
if (load(file, &content, &length) == false) 
{ 
    error(500); 
    return; 
} 

後、私は(無料呼んでいる間、これは負荷fucntion

bool load(FILE* file, BYTE** content, size_t* length) 
{ 
    printf("\nLOAD STARTED\n"); 
    content = NULL; 
    BYTE *data = NULL; 
    int size = 0; 
    while(!feof(file)) 
    { 
     char ch = fgetc(file); 
     size += 1; 
     data = realloc(data, sizeof(BYTE) * (size)); 
     *(data + (size - 1)) = ch; 
    } 
    content = &data; 
    *length = size; 
    printf("\nLOAD ENDED\n"); 
    return true; 
} 

少しある)

printf("\nFREEING CONTENT\n"); 
// free file's content 
free(content); 
printf("\nCONTENT FREED\n"); 

printf文私は

を取得した後 FREEING CONTENT作品

munmap_chunk(): invalid pointerエラーです。

+1

'content = &data;' - >> 'content = data;' – wildplasser

+0

'data [size] = ch;' - > 'data [size ++] = ch;' – BLUEPIXY

+3

@BLUEPIXYに問題があります - あなたは 'size'を決して変更しないので、' data'バッファは決して大きくなりません。また、[while(!feof(file))は(ほとんど常に)間違っています。](http://stackoverflow.com/questions/5431941/why-is-while-feof-file-always-wrong) - それは*あなたのコードで*間違っています。 –

答えて

0

これは問題です:

content = &data; 

それは関数が戻った後、スコープの外に出るのローカル変数のアドレスを割り当てます。コンテンツは関数のパラメータなので、何を指すのかは何も書き込まれません。あなたは代わりに

*content = data; 

を書きますか?そうであれば、content = NULLは、load(file, &content, &length)という呼び出しで渡されたアドレスを使用するために設定しないでください。

-1

私はそれを修正することができました。 contentは基本的にはchar*でした。だから、私はそれが動作content = &(data[0])

content = &dataを変更...

を私はこれを試してみました、それが働きました。すべての入力を気に入ってください。 :