• ベストアンサー

reallocの使い方について

C言語初心者です。malloc()で確保した領域をrealloc()にて拡張しました。以下、わからないことがあるので教えて下さい。 #include <stdio.h> #include <stdlib.h> int main(){ int *array1; array1=malloc(sizeof(int)*3); for(int i=0; i<3; i++){ *(array1+i)=i; } int *array2=array1; for(int i=0; i<3; i++){ printf("array2[%d]: %d\n", i, array2[i]); } array1=realloc(array1, sizeof(int)*5); for(int i=3; i<5; i++){ array1[i]=i; } for(int i=0; i<5; i++){ printf("array2[%d]: %d\n", i, array2[i]); } } 上記のソースコードでは、私が期待したのは array2[0]: 0 array2[1]: 1 array2[2]: 2 array2[0]: 0 array2[1]: 1 array2[2]: 2 array2[3]: 3 array2[4]: 4 なのですが、実行すると次のように表示されます。 array2[0]: 0 array2[1]: 1 array2[2]: 2 array2[0]: 0 array2[1]: 1 array2[2]: 2 array2[3]: 0 array2[4]: 1 まず最初に、array1という名前のポインタをつくり、malloc関数にて整数3つ分の領域を確保し、整数0、1、2を投入する。次に、array2という名前のポインタをつくり、array1と同じ領域を指すようにする。なので、array2にはデータを投入しなくても参照すると既に0、1、2が入っている。 次に、realloc関数にて領域を2つ追加する。追加された領域には、array1ポインタ経由で実データに整数3、4を投入する。実データが変更されたので、array2ポインタ経由でデータを参照すると、0、1、2、3、4が参照出来る、と思ったのですがそうなっていません。array1ポインタ経由で見ると、きちんと0、1、2、3、4が参照出来るのですが。。 私のreallocの理解に誤りがあれば教えて下さい。宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • hidebun
  • ベストアンサー率50% (92/181)
回答No.4

http://www9.plala.or.jp/sgwr-t/lib/realloc.html 戻り値の説明を参照。 このアドレスは、元のブロックのアドレスと異なることがあります。 つまり、内部的には、 1.新領域を確保して 2.旧領域から新領域にデータをコピーして、旧領域を破棄 3.新領域のアドレスを返す ってことを行う場合があるってことだ。

rio_grande
質問者

補足

hidebunさんご回答有り難うございました。 そうすると、正しいコーディング方法は; realloc関数を使用する場合は、他に同一の実データを指すポインタがあれば必ずメモリ追加後に再度割当後のメモリアドレスにポイントし直すこと。 ということになるということですよね↓。面倒なものなのですね。。 array1=realloc(array1, sizeof(int)*5); array2=array1; //<-重要!

すると、全ての回答が全文表示されます。

その他の回答 (4)

  • hidebun
  • ベストアンサー率50% (92/181)
回答No.5

>ということになるということですよね↓。 そうです。

rio_grande
質問者

お礼

有り難うございました!

すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2127/6290)
回答No.3

>array1[i]=i; >の部分を >*(array1+i)=i; >としたら、どうでしょうか? 前者と後者は等価です。 書き換えても、何も変わりません。

rio_grande
質問者

お礼

確かに変わりませんでした。 有り難うございました。

すると、全ての回答が全文表示されます。
  • kgi03334
  • ベストアンサー率26% (24/90)
回答No.2

array1[i]=i; の部分を *(array1+i)=i; としたら、どうでしょうか?

rio_grande
質問者

お礼

ご回答有り難うございました。 どちらのやり方も変化はありませんでした。

すると、全ての回答が全文表示されます。
  • titokani
  • ベストアンサー率19% (341/1726)
回答No.1

reallocの前後でarray1の値に違いがないかどうか調べてみましょう。

rio_grande
質問者

お礼

有り難うございました。

すると、全ての回答が全文表示されます。

関連するQ&A