0

realloc'dされたポインタにメモリを割り当てるために使用しようとするとfree、セグメンテーション違反が発生します。malloc代わりに使用すれば、この問題は発生しませんが。

変数がfree'dされた後の私の理解によると、それはポインターと同等ですがNULL、なぜこの予期しない動作なのですか?私は何かが足りないのですか?

4

6 に答える 6

4

変数が解放された後の私の理解によると、それはNULLポインターと同等です。

NULLポインタは、値がNULL;であるポインタです。reallocこの値を解釈する方法を知っているような標準関数。

解放されたメモリへのポインタは、無効なポインタになりました。その値は変わりません。 reallocはそれが無効であることを知らず、それにアクセスしようとし、セグメンテーション違反につながります。

于 2012-07-12T15:34:41.753 に答える
3

free'dされたポインタは、ポインタと同等ではありませんNULL。電話をかけた後、自分freeへのポインタを設定する必要がありNULLます。

'dreallocされているが、明示的にに設定されていないポインタを渡す場合は、おそらく無効なアドレスを渡しており、これを使用しようとすると、未定義の動作が発生し、セグメンテーション違反が発生します。freeNULLrealloc

于 2012-07-12T15:33:20.910 に答える
3

いいえfree()、ポインタを0に設定しません。自分で行う必要があります。

reallocに渡されたポインターがnullの場合、mallocされます。

于 2012-07-12T15:33:56.277 に答える
0

渡すポインタは、以前に//reallocから返された有効なポインタ、またはnullポインタのいずれかである必要があります。malloccallocrealloc

メモリを解放する場合は、ポインタをrealloc再度渡す前に、ポインタをNULLに設定する必要があります。freeポインタをNULLに設定しません(または、他の方法でポインタ自体を変更することもありません。ポインタ自体ではなく、ポインタのコピーを受け取るため、変更できません)。

于 2012-07-12T15:36:33.393 に答える
0

いいえ、free'dポインタはnullポインタと同等ではありません。 free渡されたポインタを変更しないため、ポインタは引き続き同じメモリ位置を指します。これは現在、未割り当てのメモリです。

これを実行しようとするreallocと、メモリアロケータが混乱して内部構造が破損するため、セグメンテーション違反が発生します。

于 2012-07-12T15:33:50.363 に答える
0

これは、DebianLinuxボックスのmanrealloc(3)から、知っておく必要のあるすべてのことを教えてくれるはずです。基本的に、realloc()を使用する前に解放しないでください。

realloc()は、ptrが指すメモリブロックのサイズをsizeバイトに変更します。内容は、新旧の最小サイズに変更されません。新しく割り当てられたメモリは初期化されません。ptrがNULLの場合、sizeのすべての値について、呼び出しはmalloc(size)と同等です。sizeがゼロに等しく、ptrがNULLでない場合、呼び出しはfree(ptr)と同等です。ptrがNULLでない限り、malloc()、calloc()、またはrealloc()への以前の呼び出しによって返された必要があります。指している領域が移動した場合、free(ptr)が実行されます。

于 2012-07-12T15:35:16.120 に答える