web-dev-qa-db-ja.com

malloc():メモリ破損

このエラーが発生する可能性があると思われる簡略化したプログラムを次に示します。

char *p = (char*)malloc(8192);
for(int i = 0; i < 9200; ++i){
  p[i] = '1';
}
char *s = (char*)malloc(strlen(p)); 

元のプロジェクトはかなり複雑なので、簡略化しました。 mallocを使用して8192バイトを割り当てました。次に、プログラムは8192文字以上を配列に書き込みます。次に、mallocを使用してメモリを割り当てます。

このミニプログラムはクラッシュしませんでした。しかし、元の大きなプロジェクトでは、次のエラーでクラッシュします。

malloc():メモリ破損:0x0000000007d20bd0 ***

この違いの原因は何ですか?

4
Yuan Wen

それは運の問題です。オペレーティングシステムは、要求した8kBより多くのメモリを予約する場合があります。また、前後に予約したものが動作に影響を与える可能性があります。

プログラムがバッファオーバーフローでクラッシュするとは言われていません。実際、動作は未定義であるか、実装で定義されています。

1
teroi