-2

C で、次の例をコーディングしたときにエラーが発生しました。

int *pointer;
int i = 0;
pointer = malloc(10 * sizeof(int));
pointer[i - 1] = 4;

は明らかiに への負のインデックスpointerです。

間違ったピースメモリが変更されたとしても、free(pointer)[コードの後半] でのみエラーがトリガーされるのはなぜですか? エラー: double free or corruption (out)

編集:使用されたコンパイラはgcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3

4

2 に答える 2

5

すべてではないにしてもほとんどのメモリ マネージャ (例: malloc) は、要求したメモリの周りに余分なデータを割り当てます。このエクストラは、独自のデータの一部を割り当てに追加することで、メモリ マネージャーがさまざまな割り当てを管理できるようにするためのものです。負のインデックスを作成したときに、この余分なデータを上書きしました。それ自体は無効なメモリではないため、CPU はそれを防ぐことはできませんが、malloc は、データが破損していることを確認すると、実際に文句を言います。これは free() で発生します。

于 2013-02-10T05:32:40.677 に答える
1

基本的に、pointer[-1]あなたが行った方法でアクセスすると、未定義の動作が発生します。理論的には、何でも起こり得ます。しかし、実際には、表示された特定のエラー メッセージについて適切な説明があります。

正しく動作できるmallocように、割り当てられたメモリのチャンクのサイズをどこかに保存する必要があることを思い出してください。free一部のシステムでは (あなたのシステムもその中に含まれているようです)、この情報は返されるアドレスの直前にメモリに保存されmallocます。(システムの実装について知りたい場合は、その値を出力すると面白いかもしれません。)

そのメモリのチャンクを上書きすると、システムの内部が一貫性のない状態のままmallocfreeなり、freeこれが発見されたときにエラーが報告されました。もちろん、このような発見の可能性が最も高いのは、メモリ管理関数がこのメモリ領域について呼び出されたときです。(次に を呼び出したときに一部のmalloc破損が検出されますmallocが、通常はそれを達成するためにはより慎重な作業が必要です。) を呼び出すreallocと、同様のエラー メッセージが表示されるはずです。

于 2013-02-10T05:37:25.233 に答える