0

私のプログラムは C で書かれており、ディスク エミュレーターです。テストプログラムの特定の行をコメントアウトすると実行されますが、コメントを外すとメモリエラーが発生します。私はそれが私の char* にあると思われます。

コメントアウトした行 (およびプログラムがクラッシュする場所) は次のとおりです。

free(buffer);

ここで、buffer は、ディスクから読み取られたバイト文字列を表す char* です。malloc を使用して最初に 30 バイトが割り当てられました。

char* buffer = (char *) malloc(sizeof(char) * 30);

ここにすべてを投稿するには多すぎるので、誰かが私が間違っていることを見てくれることを期待して、書き込み/コピーしている部分を char* に入れます。

私はそれが複雑すぎるとは思いません.Cに十分に慣れていないだけで、明らかなメモリの間違いを認識することができません.

 // In the event of a cache miss:

 // block_buffer to pass to add_cache_entry
 char cMissBuffer[BLOCK_SIZE];

 // read content of block from disk 
 fread(cMissBuffer,sizeof(char),BLOCK_SIZE,diskEntity.pBlockStore);

 // add to cache
 if(1==add_cache_entry(i,cMissBuffer)) return 1;
 .
 .
 .
 // some of what is in add_cache_entry

 int add_cache_entry(int v, char *block_buffer)
 {
    // ...
    // construct a new queue element
    QueueElement *block_to_cache = (QueueElement*)malloc(sizeof(QueueElement));
    block_to_cache->blkidx = v;

    block_to_cache->content=(char*)malloc(BLOCK_SIZE);
    strcpy(block_to_cache->content,block_buffer);
// ...
 }

テストでは、BLOCK_SIZE は 5、QueueElement は構造体、コンテンツは情報の BLOCK_BYTES を持つ char* です。

これは、実行可能ファイルの実行 (キューのダンプ) からの抜粋です...「\0」がないことが問題に関係している可能性があると思います...

after adding cache entry (5):
DUMP:
BLOCK 5 FLAG:0 CONTENT:222220000000
BLOCK 4 FLAG:0 CONTENT:222220000000
BLOCK 3 FLAG:0 CONTENT:000000000000
BLOCK 2 FLAG:0 CONTENT:000000000000
BLOCK 1 FLAG:1 CONTENT:11100

malloc が必要以上のスペースを割り当てるため、余分なスペースが得られると思いますが、それは正常なことだと読みました。

何かご意見は?

4

1 に答える 1

3

この動作の原因として考えられるのstrcpy()は、ソース文字列を null で終了する必要があることです。これは、null ターミネータを追加しないため、ここでfread()は当てはまりません (この場合fread()、正確なバッファー サイズを読み取ることもできません)。strcpy()また、ヌル ターミネータを追加します。これは、strcpy()呼び出しが確実にblock_to_cache->contentバッファを超えて書き込むことを意味します。

データが C スタイルの文字列として使用されない場合は、memcpy()代わりにデータをコピーするために使用します。

memcpy(block_to_cache->content, block_buffer, BLOCK_SIZE);

その他のポイント:

  • の戻り値をチェックして、fread()使用を試みる前にバッファが正常に読み込まれたことを確認してください。
  • の戻り値をキャストする必要はありませんmalloc()(「malloc の結果をキャストしますか?」を参照してください)。
  • の戻り値をチェックmalloc()して、メモリが正常に割り当てられたことを確認します。
  • sizeof(char)は 1 であることが保証されているため、 への引数から削除できますmalloc()
于 2012-10-01T19:41:18.823 に答える