1

reallocいくつかの文献を読んで、void ポインターとサイズ変数を受け取り、void ポインターが指すブロックのメモリを再割り当てすることを理解できました。

  • 文字サイズのrealloc整数ポインタ ( ) で を呼び出すとどうなりますか? int *およびその逆。

  • これはどのような応用が考えられるでしょうか?(例は間違いなく役立ちます。)

4

5 に答える 5

7

このrealloc()機能は、オールインワンのメモリ管理システムです。

  • null ポインターとゼロ以外のサイズで呼び出された場合、メモリが割り当てられます。
  • 有効なポインターとゼロのサイズで呼び出された場合、メモリを解放します。
  • 有効なポインターとゼロ以外のサイズで呼び出された場合、割り当てられたメモリのサイズが変更されます。

realloc()無効なポインタ ( から取得されたものではないもの) で呼び出すと、未定義のmalloc()動作が発生します。calloc()realloc()

realloc()割り当てられたバイト空間 (1 バイト) に整数ポインタを渡すことはできますがsizeof(char)、未定義の動作を引き起こす危険があります。問題はありませんrealloc()。使用できない整数ポインターが指定されたコードにあります。1 バイトしか割り当てられてsizeof(int)いませんが、1 より大きいため (基本的にすべてのシステムで、例外がある可能性がありますが、この質問をする人にはそうではありません)、free()またはに渡す以外に、そのポインターを安全に使用する方法はありませんrealloc()

与えられた:

int *pointer = malloc(sizeof(char));

*pointer = 0;書き込むのに十分なスペースが(正式に)割り当てられていないため、実行できません。int x = *pointer;読み取るのに十分なスペースが(正式に)割り当てられていないため、実行できません。「正式に」という言葉があるのは、実際には、メモリ アロケータが最小サイズのチャンク (多くの場合 8 または 16 バイト) を割り当てるため、実際には 1 バイトの後にスペースがあるためです。ただし、標準が保証する範囲を超えており、正確に 1 バイトを渡すメモリ アロケータを考えることができます。だから、それを危険にさらさないでください。割り当てられたメモリの 1 バイトへの整数ポインタは、メモリ割り当て関数への引数として以外は使用できません。

への最初の引数realloc()void *. スコープ ( #include <stdlib.h>) 内にプロトタイプを作成するので、コンパイラは (そのようなキャストに対して何かする必要がある場合) を に変換し、int *指定void *されたスペースが割り当てられている限り、すべて問題ありません。realloc()割り当てサイズを変更して、おそらく同じポインターを返すか、別のポインターを返すか、新しいサイズがゼロバイトの場合はスペースを解放します。

于 2013-01-05T16:33:05.650 に答える
2

NULLに渡す非ポインタには非常に重要な要件があります。それらは、またはreallocへの呼び出しから取得する必要があります。そうでない場合、動作は未定義です。malloccallocrealloc

を格納するのに十分なメモリのチャンクを割り当て、int次に を格納すると、reallocはより小さいか等しいcharため、常に同じポインタが返されます。sizeof(char)sizeof(int)

int* intPtr = malloc(sizeof(int));
int* otherPtr = realloc(intPtr, sizeof(char));
// intPtr == otherPtr

逆に試してみると、ほぼ確実に同じポインタが返されます。これは、メモリ アロケータが、メモリをsizeof(int). ただし、結果は実装に依存するため、理論的には異なるアドレスが返される可能性があります。

上記の演習の有用性に関する限り、有用ではありません。realloc可変サイズの配列を管理し、そのような配列のサイズを大きくするためのコードを簡素化し、潜在的に数を減らすことを目的として設計されています。割り当てとコピー。reallocスカラーを -ing する理由がわかりません。

于 2013-01-05T16:29:28.210 に答える
0

あなたが言ったように、の最初のパラメータの型はreallocです。void *したがって、渡す関数の引数はvoid ポインターに変換されます。これは、暗黙的で安全な変換です。

long int基本的に、引数付きのパラメーターで関数を呼び出した場合と同じですint

于 2013-01-05T16:24:42.040 に答える
0

Realloc はサイズをバイト単位で取得します。もしあなたがそうするなら

int* a= malloc(sizeof(int));

その後

a=realloc(a,1);

もちろん、 a は int 型には十分な大きさではなく、 int を書き込むと奇妙な動作が発生します。

于 2013-01-05T16:25:20.937 に答える
0

dasblinkenlight が述べたように、realloc はスカラーには意味がありません。あなたの例では:

int * a = malloc(sizeof(int));
int * b = realloc(a,sizeof(char));

sizeof(char) < sizeof(int)であり、データを新しい場所に移動する理由がないため、a == bになります。 違いは、realloc を使用して割り当てられたスペースを減らしたため、realloc の後に int を未割り当てスペースに書き込んでいることです。ここでは、これは理論的な関連性にすぎません。アラインメントのため、OS が解放されたメモリを再利用する可能性はほとんどありません。しかし、それに頼ってはいけません。これは未定義の動作です。 long int のスペースを int にサイズ変更すると、関連する可能性があります。これは、アーキテクチャによって異なります。 未割り当て領域への書き込みは、時限爆弾を仕掛けて、いつ爆発するかわからないようなものです。割り当てられたスペースからの読み取り/書き込みのみを行う必要があります。


于 2013-01-05T17:04:08.653 に答える