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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 3 2022/10/27 17:44
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 1 2022/10/27 14:21
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/03/07 14:05
- WordPress(ワードプレス) wordpressでphpを読み込みたい 1 2022/10/30 23:40
- Visual Basic(VBA) 型が一致しませんとエラー 6 2023/07/06 20:14
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/03/02 08:40
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/03/08 09:08
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
STLのvectorで作った配列をメン...
-
読み(あ行~わ行)ごとに分け...
-
行列
-
配列の要素(value)に、変数を...
-
濁点のソート
-
mallocで char *型の配列を確...
-
CArrayの要素としてCStringArra...
-
pg_copy_fromの使い方について...
-
php で1から100までの素数の表...
-
Perlで重複行を削除したい
-
foreachのなかで次のキーを参照...
-
String だと「 ByRef引数の型が...
-
エラーメッセージ(無効な間接...
-
PHPでCSVの一部の行を編集したい
-
$_SESSIONに二次元配列を使える...
-
PHPのカッコ[ ]の使い方について
-
OCI で、SELECT結果行数を取得...
-
rubyで複数列のデータを一行に...
-
CSVデータの行数カウントをした...
-
別ファイルの構造体の値を読み...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラミングのPythonのnoteb...
-
C言語の配列をPush(追加)する...
-
php で1から100までの素数の表...
-
STLのvectorで作った配列をメン...
-
スカラーのベクトル微分
-
行列
-
Perlで重複行を削除したい
-
配列の要素(value)に、変数を...
-
特定の文からメールアドレスの...
-
forとかで連番の変数を一気に格...
-
C言語 最大値と最小値を求めて...
-
CArrayの要素としてCStringArra...
-
PHPでユニークIDを作る
-
fgetc関数について
-
読み(あ行~わ行)ごとに分け...
-
Pager::factory()の使い方がわ...
-
verilogで、配列の一部をタスク...
-
mallocで char *型の配列を確...
-
c言語 単位行列
-
連想配列で値が空だったら、要...
おすすめ情報