
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を探す
今、見られている記事はコレ!
-
弁護士が解説!あなたの声を行政に届ける「パブリックコメント」制度のすべて
社会に対する意見や不満、疑問。それを発信する場所は、SNSやブログ、そしてニュースサイトのコメント欄など多岐にわたる。教えて!gooでも「ヤフコメ民について」というタイトルのトピックがあり、この投稿の通り、...
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
-
なぜ批判コメントをするの?その心理と向き合い方をカウンセラーにきいた!
今や生活に必要不可欠となったインターネット。手軽に情報を得られるだけでなく、ネットを介したコミュニケーションも一般的となった。それと同時に顕在化しているのが、他者に対する辛らつな意見だ。ネットニュース...
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
array_mapの再帰処理がうまく行...
-
ファイルの書き込みについて教...
-
PHPで2次元配列を1次元配列に...
-
php 1桁になるまでの和 スマー...
-
CArrayの要素としてCStringArra...
-
Eclipseコンテンツアシストでプ...
-
プルダウンメニューにDBの内容...
-
別ファイルの構造体の値を読み...
-
phpでcsvファイルから二次元配...
-
$_SESSIONに二次元配列を使える...
-
配列をループでたくさん宣言し...
-
foreachのなかで次のキーを参照...
-
配列同士の足し算のループ処理
-
エラーメッセージ(無効な間接...
-
C言語でCSVファイルの行数を読...
-
phpでCSVファイルの中身を多次...
-
parse_ini_file関数について
-
postgresql関数をつかったレコ...
-
FortranのOPEN文
-
fgetsを使ってcsvからcsvに
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語の配列をPush(追加)する...
-
cakephpでのトランザクション処...
-
行列
-
読み(あ行~わ行)ごとに分け...
-
特定の文からメールアドレスの...
-
c言語 単位行列
-
STLのvectorで作った配列をメン...
-
多次元配列をエンコードする関...
-
2次元配列を1次元配列にするには
-
phpで、配列の値が意図せず変わ...
-
Delphiで別unitで宣言した「TAr...
-
連想配列に追加ってできるン?
-
正規表現
-
配列の並びについて
-
PHPでCSVを出力するさいに、ル...
-
pascalについて知りたいのです...
-
文字列の取得について
-
ファイルの書き込みについて教...
-
数独かを判断するプログラム
-
文字列の並び替え
おすすめ情報