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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Smarty 三次元配列を使いたい
-
配列 一部除外してソート?
-
Smartyで多次元配列をスマート...
-
C言語 最大値と最小値を求めて...
-
特定の文からメールアドレスの...
-
読み(あ行~わ行)ごとに分け...
-
MYSQLとPHPによって取得する多...
-
数独かを判断するプログラム
-
bashで配列から、特定の要素を...
-
濁点のソート
-
配列から別の配列の要素を削除...
-
PHPは何故値渡しより参照渡しの...
-
ショッピングカートで$_SESSION...
-
かなでの並び替え
-
再帰の仕方
-
$arrN[0] = $arrN[1] = $arrN[2...
-
in_array関数について
-
配列の要素(value)に、変数を...
-
ulのネストをタブ区切りに変換...
-
配列をループでたくさん宣言し...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
配列の要素(value)に、変数を...
-
特定の文からメールアドレスの...
-
読み(あ行~わ行)ごとに分け...
-
C言語の配列をPush(追加)する...
-
STLのvectorで作った配列をメン...
-
CArrayの要素としてCStringArra...
-
verilogで、配列の一部をタスク...
-
System.String.Splitでエラー
-
Perlで重複行を削除したい
-
行列
-
C言語 最大値と最小値を求めて...
-
スカラーのベクトル微分
-
PHPで2次元配列を1次元配列に...
-
array_intersectで空欄を比較し...
-
mallocで char *型の配列を確...
-
Pascalの手続きについて
-
複数のforeachをまとめるには
-
数独かを判断するプログラム
-
ソートの名称について
-
PHPのmin関数、「1」以上の数値...
おすすめ情報