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