0

重複の可能性:
realloc および malloc 関数

#include<stdio.h>
#include<stdlib.h>
void main()
{
  int *p;
  p = malloc(6);
  p = realloc(p, 10);
  if (p == NULL)
  {
    printf("error"); // when does p point to null consider i have enough space in prgrm
                     //memory area but not in memory where realloc is trying to search 
                     //for the memory, I dont know how to explain that try to undrstnd
   exit(1);
   }
}

コードのこの例を取り上げます。合計メモリが 10 バイトであり、2 バイトが int 型へのポインターの宣言によって使用され、さらに 6 バイトが malloc 関数によって使用され、残りの 2 バイトが他のプログラムによって占有されているとします。今、realloc 関数を実行するとポインターが指しているメモリを拡張するために、メモリ内で 10 バイトを検索し、それが利用できない場合は、ヒープ領域から 10 バイトのメモリを割り当て、malloc の内容をコピーして、ヒープ領域内の新しく割り当てられたメモリ領域に貼り付けます。次に、mallocに格納されているメモリを削除しますよね?

メモリが使用できないため、realloc() は NULL ポインターを返しますか? 権利はありません!?メモリ割り当ての権利のためにヒープ領域に移動しますか?NULL ポインターを返しませんよね?

私の言うことを聞いてください: | 01 | 02 | 03 | 04 | 05 | 06 | 07 |08 |09 | 10 |

これをメモリ ブロックと見なします。01 から 06 は malloc() 関数によって使用され、07 と 08 は空きで、最後の 2 ブロック、つまり 09 と 10 は他のプログラムのメモリによって使用されていると仮定します。realloc(p,10) を呼び出すと、10 バイトが必要ですが、空いているバイトは 2 バイトしかないので、realloc は何をしますか? NULL ポインタを返すか、ヒープ領域からメモリを割り当てて、メモリの 01 ~ 06 ブロックの内容をヒープ領域のそのメモリにコピーする方法を教えてください。

4

3 に答える 3

2

malloc

  1. これにより、メモリ ブロックが使用可能な場合は割り当てられます。使用できない場合は NULL が返されます。

再割り当て

  1. 渡されたサイズが既存のブロックよりも大きい場合、これは既存のメモリを拡張しようとします。拡張に成功すると、同じポインタが返されます。
  2. または、展開に失敗した場合は、新しいメモリ ブロックを割り当て、古いデータを古いメモリ ブロックから新しいメモリ ブロックにコピーします。次に、古いブロックを解放し、新しいブロック アドレスを返します。
  3. 新しいメモリ ブロックの割り当てに失敗した場合は、古いメモリ ブロックを解放せずに、単純に NULL を返します。
  4. 関数に渡されたサイズがゼロの場合realloc、古いメモリ ブロックが解放され、NULL が返されます。realloc(ptr, 0)と同等free(ptr)です。
  5. 関数に渡されたサイズがrealloc古いメモリ ブロックのサイズより小さい場合、メモリが縮小されます。

あなたのシナリオへの答え

私の言うことを聞いてください: | 01 | 02 | 03 | 04 | 05 | 06 | 07 |08 |09 | 10 |

これをメモリ ブロックと見なします。01 から 06 が malloc() によって使用されたとします。
func、07 と 08 はフリーで、最後の 2 ブロック、つまり 09 と 10 は
他のプログラムのメモリ。realloc(p,10) を呼び出すと、10 バイトが必要ですが、
空きバイトが 2 バイトしかないのに、realloc は何をするのでしょうか? NULL ポインタを返す
またはヒープ領域からメモリを割り当て、01から06の内容をコピーします
ヒープ領域のそのメモリにメモリのブロックを教えてください。

はい、古いメモリブロックから新しいメモリブロックにコンテンツをコピー01し、古いメモリブロックを解放してから、新しいメモリブロックのアドレスを返します。06

于 2012-08-25T15:00:33.263 に答える
2

戻り値

...

realloc() 関数は、新しく割り当てられたメモリへのポインタを返します。これは、あらゆる種類の変数に対して適切に配置され、ptr とは異なる場合があり、要求が失敗した場合は NULL になります。size が 0 の場合、NULL または free() に渡すのに適したポインターが返されます。realloc() が失敗した場合、元のブロックはそのまま残ります。解放または移動されません。

于 2012-08-25T13:58:03.557 に答える
0

実装方法malloc は、定義上、システムまたは実装に依存します。(ばかげていますが、標準に準拠している の実装は、mallocを返すことによって常に失敗しNULLます。ほとんどの実際の実装は、これよりも優れています)。

まず、 mallocreallocfree (Posix 標準)の動作仕様をお読みください。

于 2012-08-25T13:58:08.187 に答える