mallocを練習してメモリを解放しようとしましたが、このプログラムでfree()関数を実行すると無効なポインタに対してエラーが返されます。私が間違っていることを誰かに教えてもらえますか?
エラーは次のとおりです: * `のエラー。 / malloc1 “:free():無効なポインタ:0x000000000216c421 * 中止
そしてここに私のコードがあります:
include
include
int main(void){//古いファイルを開くFILE * old_file = fopen( “words.txt”、 “r”); if(old_file == NULL){ printf( “ファイルが見つかりません。”); return 1;}
//open a new file FILE* new_file = fopen("new_words.txt", "w"); if (new_file == NULL) { printf("Unable to create file."); return 2; } for (int i = 0; i < 21; i++) { char* storage = malloc(sizeof(char)); if (storage == NULL) { printf("Error."); return 3; } fread(&storage, sizeof(char), 1, old_file); fwrite(&storage, sizeof(char), 1, new_file); free(storage); } //close both files fclose(old_file); fclose(new_file);
}
回答
問題はfread(&storage, sizeof(char), 1, old_file);
にあります。この行は、読み取られたデータをポインタに直接格納し、mallocされたメモリのアドレスを上書きしています。ポインタに格納されているアドレスが指すメモリにデータを格納していません。free()呼び出しを実行すると、無効なアドレスを解放しようとします。また、mallocのメモリのアドレスが置き換えられているため、メモリリークが発生しています。fread()およびfwrite()から&
を削除すると、機能します。
これで質問に答える場合は、チェックマークをクリックして同意してください。フォーラムのメンテナンスを続けましょう。 😉