15

10 要素の整数配列を作成するための 2 つのコード サンプルがあるとします。

int *pi = (int*)0; 
realloc(pi,10);

もう 1 つは、通常どおりに記述されたものです。つまり、次のようになります。

int *pi;
pi= malloc(10*sizeof(int));

さて、私の質問は次のとおりです。最初のタイプの割り当ては合法ですが、使用されていません。選択した開始場所を取得できるのに、なぜですか?
定数を使用したポインターの初期化は有効ですが、使用されません。なんで?

4

3 に答える 3

30

NULLが渡された場合、reallocは と同等mallocです。このNULL呼び出しは、ある種のループで再割り当てを行っていて、最初に割り当てたときに特別なケースを持ちたくない場合に便利です。


malloc と realloc を使用するかなり標準的な方法は次のとおりです。

int* p;
p = malloc(10 * sizeof(int)); //Note that there's no cast
//(also, it could just be int* p = malloc(...);)

int* np = realloc(p, 15 * sizeof(int));
//Note that you keep the old pointer -- this is in case the realloc fails

余談ですが、宣言と代入が異なる行に表示される主な理由は履歴です。C の古いバージョンでは、宣言は関数の最初に来なければなりませんでした。つまり、関数が 20 行まで変数を使用しなかったとしても、先頭で宣言する必要がありました。

通常、別の 20 行で使用されていない変数の値がどうあるべきかわからないため、常に意味のある値に初期化できるとは限りません。関数。

C99/C11 では、スコープの先頭で変数を宣言する必要はありません。実際、一般的には、変数を可能な限り使用に近い形で定義することが推奨されています。

于 2012-11-12T19:50:36.373 に答える
10

C では、 に渡されるポインターが、または関数呼び出し (またはヌル ポインター)reallocから取得されたポインターである必要があります。malloccallocrealloc

于 2012-11-12T19:50:26.147 に答える
4

最初の代入は正当ではありません。これは、渡されるポインターがrealloc()何らかの割り当てによって以前に与えられている必要があるためです。(さらに、その戻り値を無視しています。これは、割り当てで絶対に行ってはならないことです!)

malloc()固定サイズの何かのバッファを作成することです。realloc()1 つのバッファーを返して、(おそらく) 異なるサイズの別のバッファーを取得することです。これにより、使用していたのと同じバッファーが返される可能性があります。

于 2012-11-12T19:51:47.033 に答える