
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の理解に誤りがあれば教えて下さい。宜しくお願いします。
No.4ベストアンサー
- 回答日時:
戻り値の説明を参照。
このアドレスは、元のブロックのアドレスと異なることがあります。
つまり、内部的には、
1.新領域を確保して
2.旧領域から新領域にデータをコピーして、旧領域を破棄
3.新領域のアドレスを返す
ってことを行う場合があるってことだ。
この回答への補足
hidebunさんご回答有り難うございました。
そうすると、正しいコーディング方法は;
realloc関数を使用する場合は、他に同一の実データを指すポインタがあれば必ずメモリ追加後に再度割当後のメモリアドレスにポイントし直すこと。
ということになるということですよね↓。面倒なものなのですね。。
array1=realloc(array1, sizeof(int)*5);
array2=array1; //<-重要!
No.3
- 回答日時:
>array1[i]=i;
>の部分を
>*(array1+i)=i;
>としたら、どうでしょうか?
前者と後者は等価です。
書き換えても、何も変わりません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語の配列をPush(追加)する...
-
【PHP】配列のキー名の修正は可...
-
cakephpでのトランザクション処...
-
Delphiで別unitで宣言した「TAr...
-
どのような関数名を付けるべき...
-
CArrayのソート
-
プルダウンメニューにDBの内容...
-
PHPのカッコ[ ]の使い方について
-
配列をループでたくさん宣言し...
-
自動で番号を振りたい
-
PHPにてクラスを配列にすること...
-
file_existsでファイル名の部分...
-
String だと「 ByRef引数の型が...
-
マッチング処理(1:N)
-
ネストが深い時のforeachはどう...
-
ftokが動かない?
-
C言語でCSVファイルの行数を読...
-
No.を降順で表示するには
-
foreachとかの勝手な省略?
-
cookieとIPアドレス記録を利用...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語の配列をPush(追加)する...
-
STLのvectorで作った配列をメン...
-
行列
-
CArrayのソート
-
読み(あ行~わ行)ごとに分け...
-
C言語 最大値と最小値を求めて...
-
delphi 2次元配列がわかりません
-
CArrayの要素としてCStringArra...
-
特定の文からメールアドレスの...
-
System.String.Splitでエラー
-
verilogで、配列の一部をタスク...
-
PHPで10連ガチャを作成したいの...
-
再帰関数を用いて配列の合計を...
-
cakephpでのトランザクション処...
-
mb_encode_numericentityでタグ...
-
配列を指定した順序でソート
-
多次元配列をエンコードする関...
-
forとかで連番の変数を一気に格...
-
楽天市場ジャンル検索APIで順番...
-
正規表現
おすすめ情報