dポイントプレゼントキャンペーン実施中!

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の理解に誤りがあれば教えて下さい。宜しくお願いします。

A 回答 (5件)

http://www9.plala.or.jp/sgwr-t/lib/realloc.html

戻り値の説明を参照。
このアドレスは、元のブロックのアドレスと異なることがあります。

つまり、内部的には、
1.新領域を確保して
2.旧領域から新領域にデータをコピーして、旧領域を破棄
3.新領域のアドレスを返す
ってことを行う場合があるってことだ。

この回答への補足

hidebunさんご回答有り難うございました。
そうすると、正しいコーディング方法は;
realloc関数を使用する場合は、他に同一の実データを指すポインタがあれば必ずメモリ追加後に再度割当後のメモリアドレスにポイントし直すこと。

ということになるということですよね↓。面倒なものなのですね。。
array1=realloc(array1, sizeof(int)*5);
array2=array1; //<-重要!

補足日時:2008/09/10 17:09
    • good
    • 0

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


そうです。
    • good
    • 0
この回答へのお礼

有り難うございました!

お礼日時:2008/09/10 17:20

>array1[i]=i;


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

前者と後者は等価です。
書き換えても、何も変わりません。
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/09/10 17:21

array1[i]=i;


の部分を
*(array1+i)=i;
としたら、どうでしょうか?
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/09/10 17:21

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

    • good
    • 0
この回答へのお礼

有り難うございました。

お礼日時:2008/09/10 17:22

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!