realloc
いくつかの文献を読んで、void ポインターとサイズ変数を受け取り、void ポインターが指すブロックのメモリを再割り当てすることを理解できました。
文字サイズの
realloc
整数ポインタ ( ) で を呼び出すとどうなりますか?int *
およびその逆。これはどのような応用が考えられるでしょうか?(例は間違いなく役立ちます。)
realloc
いくつかの文献を読んで、void ポインターとサイズ変数を受け取り、void ポインターが指すブロックのメモリを再割り当てすることを理解できました。
文字サイズのrealloc
整数ポインタ ( ) で を呼び出すとどうなりますか? int *
およびその逆。
これはどのような応用が考えられるでしょうか?(例は間違いなく役立ちます。)
このrealloc()
機能は、オールインワンのメモリ管理システムです。
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()
割り当てサイズを変更して、おそらく同じポインターを返すか、別のポインターを返すか、新しいサイズがゼロバイトの場合はスペースを解放します。
NULL
に渡す非ポインタには非常に重要な要件があります。それらは、またはrealloc
への呼び出しから取得する必要があります。そうでない場合、動作は未定義です。malloc
calloc
realloc
を格納するのに十分なメモリのチャンクを割り当て、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 する理由がわかりません。
あなたが言ったように、の最初のパラメータの型はrealloc
です。void *
したがって、渡す関数の引数はvoid ポインターに変換されます。これは、暗黙的で安全な変換です。
long int
基本的に、引数付きのパラメーターで関数を呼び出した場合と同じですint
。
Realloc はサイズをバイト単位で取得します。もしあなたがそうするなら
int* a= malloc(sizeof(int));
その後
a=realloc(a,1);
もちろん、 a は int 型には十分な大きさではなく、 int を書き込むと奇妙な動作が発生します。
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 にサイズ変更すると、関連する可能性があります。これは、アーキテクチャによって異なります。
未割り当て領域への書き込みは、時限爆弾を仕掛けて、いつ爆発するかわからないようなものです。割り当てられたスペースからの読み取り/書き込みのみを行う必要があります。