17

の正しい使い方を要約できる人はいますrealloc()か?

realloc()失敗した時どうする?

私がこれまで見てきたことから、realloc()失敗した場合はfree()古いポインターを使用する必要があるようです。本当?

次に例を示します。

   1.  char *ptr = malloc(sizeof(*ptr) * 50);
   2.  ...
   3.  char *new_ptr = realloc(ptr, sizeof(*new_ptr) * 60);
   4.  if (!new_ptr) {
   5.      free(ptr);
   6.      return NULL;
   7.  }

linerealloc()で失敗したとします3。私はing5によってオンラインで正しいことをしていますか?free()ptr

4

4 に答える 4

20

http://www.c-faq.com/malloc/realloc.htmlから

realloc が十分なスペースをまったく見つけられない場合、null ポインターを返し、以前に割り当てられた領域をそのままにします。

したがって、以前に割り当てられたメモリをまだ解放する必要があります。

于 2010-07-25T22:13:02.767 に答える
1

それはあなたが何をしたいかによります。失敗したときrealloc、あなたは何をしたいですか? 古いブロックを解放するか、そのままにしてそのままにしておくか? 解放したい場合は、解放してください。

また、C89/90 では、reallocターゲット サイズがゼロのリクエストを行うとrealloc、元のメモリの割り当てが正常に解除された場合でも、関数が null ポインターを返す可能性があることに注意してください。これは、C89/90 の欠陥でした。null リターンで成功と失敗を区別する方法がなかったためです。

C99 では、この欠陥が修正され、null リターンと再割り当ての成功/失敗の間の厳密な関係が保証されました。C99 では、null リターンは常に の完全な失敗を意味しreallocます。

于 2010-07-25T22:19:12.150 に答える
0

realloc が失敗した場合、元のブロックが失われるため、元のブロックを削除したくないと思います。realloc は古いブロックのサイズを変更し (または新しい場所へのポインターを返す)、成功すると古いブロック (または新しい場所) へのポインターを返し、失敗すると NULL を返すようです。新しいブロックを割り当てることができなかった場合、古いブロックは変更されません。

于 2010-07-25T22:25:00.097 に答える
-3

編集:修正、一部の人々は私が言ったことで私をバッシングしています。あなたがポインタを割り当てた方法は彼らの中でベストプラクティスのようです.私は常に型キャストを使用するように教えられましたsizeof().私が言ったこと=)

以前にhttp://en.wikipedia.org/wiki/Malloc#reallocをのぞいてみると、何か良いことがあったかもしれません。

よくわかりませんsizeof()-渡す引数のサイズの値がバイト単位で含まれています。たとえば、sizeof(int)ほとんどの 32 ビット システムでは 4 になりますが、コードを 64 ビット システムでコンパイルすると (例として) その値が 8 になり、コードは正常にコンパイルされるため、sizeof(int)代わりに を使用する必要があります。4何のためにメモリを割り当てていますか?ポインタ?その場合は、sizeof(void*)代わりに使用する必要があります (言うことができますsizeof(int*)が、すべてのポインターは同じサイズにする必要があるため、これらのポインターに格納するものをコンパイラーに言及しないのが一般的な慣習です。ほとんどのプログラマーはそう言いますsizeof(void*))、文字用のスペースが必要な場合使用sizeof(char)など。

realloc()ただし、多くのプログラマーは、システムに常に十分なメモリがあると想定して、それでうまくいくと思いますが、新しいポインタにの戻り値を格納してチェックするのは正しいことです。

于 2010-07-25T22:21:40.717 に答える