2

奇妙な問題があります: 私のコードは機能しています。具体的にはこれが機能しています。なんで?

char **array = malloc(0);
array[0] = malloc(0);
strcpy(array[0],"hello");
array[1] = malloc(0);
strcpy(array[1],"world");

一体何が起こっているのですか?malloc のいずれかを NULL に置き換えたり、それらを削除したりしても機能しませんが、malloc 内の値が負ではないことは問題ではないようです。

4

3 に答える 3

1

無効なポインターの逆参照は未定義の動作です。何でも起こり得るように。

于 2012-10-28T11:05:11.033 に答える
1

malloc(0)は実装定義であり、null ポインターまたは無効なポインターのいずれかを返します。

によって返されるポインターを使用して、未定義の動作を呼び出していますmalloc(0)

于 2012-10-28T11:05:25.760 に答える
0

の未定義の動作に加えて、malloc(0). Malloc の実装では、アラインメントの理由から、割り当てられたブロックの粒度が最小限になることがよくあります。これは、実装に応じて、どのブロックも常に少なくとも 4、8、12、16 バイトのサイズを持つことを意味します。私の記憶が正しければ、mallopt特定のプラットフォームで呼び出しを使用してこの値を設定することもできます。

もう 1 つのことは、割り当てコードでのバッファー オーバーフローは、多くの場合、ポインターを解放しようとしたときにのみクラッシュするということです。これは、ライブラリによって使用される内部ブック キープに使用されるブロック周辺のメモリが解放されるためです。これが、バッファ オーバーフローをキャッチするのが非常に難しい理由の 1 つです。バッファ オーバーフローは、発生時とは異なる場所と時間に現れます。

于 2012-10-28T11:46:56.503 に答える