-4

コードを見てください:

#include<stdio.h>


 #include<stdlib.h>
void main()
{
  int *p;
  p = malloc(6);
  p = realloc(p, 10);
  if (p == NULL)
  {
    printf("error");
   exit(1);
   }
}

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

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

4

2 に答える 2

3

正解 --realloc渡したメモリ ブロックのサイズを変更できない場合は、新しいブロックを作成し、データをコピーして、古いブロックの割り当てを解除します。

でも:

  1. malloc実装は通常、バイトの粒度で動作しません。私が見たもののほとんどは、すべてを最も近い 16 バイトに切り上げます。これにより、アカウンティングが容易になり、多くのユーザーがとにかくそのアライメントを必要とするからです。あなたの場合、realloc両方のサイズが 16 バイトに切り上げられるため、これはノーオペレーションになります。

  2. 最も一般的なマルチタスク オペレーティング システムでは、アプリケーションがアクセスできる唯一のメモリはそれ自身のものです。他のアプリケーションのメモリが邪魔になることは決してありません。ただし、ライブラリまたは他のスレッドによって割り当てられたメモリは可能性があります。

于 2012-08-25T06:29:40.260 に答える
1

reallocの仕様で述べられているように:

メモリ オブジェクトの新しいサイズがオブジェクトの移動を必要とする場合、オブジェクトの以前のインスタンス化のための領域が解放されます。

于 2012-08-25T06:29:37.220 に答える