※ ChatGPTを利用し、要約された質問です(原文:realloc関数でメモリエラー)
realloc関数でメモリエラー
このQ&Aのポイント
Microsoft VS 6.0 で作成したプログラムでrealloc関数を使用すると、メモリエラーが発生してしまいます。
realloc関数を複数回使用すると、他のメモリ領域が破壊される可能性があります。
realloc関数を使用せずにmalloc関数のみを使用すると、メモリエラーは発生しません。
いつもお世話になります。
今、Microsoft VS 6.0 でrealloc関数を使用したプログラムを作成した所、
メモリエラーが発生してしまいました。
どうも、調査を行なっていくと、realloc関数を何回か使用していくと、
別のメモリ領域を破壊(?)しているように思えます。
そのような現象って、他の方々も発生した事があるのでしょうか??
それとも何か落とし穴が???
どなたか情報をもっている方、是非是非お願いします。
ちなみに、reallocを使用せず、malloc関数のみで作成したプログラムでは
発生してません。
----------------
【reallocを使用していて作成した関数】
ファイルを読み込み、1件読むたびにrealloc関数でエリア拡張
(最初の1件目はmalloc関数にてエリア確保、2件目以降realloc使用)
【原因】
ポインタ変数の内容(アドレス値)が変更されている事が発覚
→おかしくなったエリアを参照しようとしてメモリエラーが発生
↓
変更された個所を選定していくと、
「realloc」関数を使用後変更されている事が発覚
※変更されていたポインタ変数は、「realloc」関数使用時には
全く参照もしていない変数で、ロジック上値を変更するような事は
なかった
↓
「realloc」関数を使用すると常に発生しているわけではない事は確認済
(たまに発生 ←メモリ領域へのアロケートなので取得するエリアによって発生すると推測)
↓
同様のロジックを予め件数を数えた後、
「malloc」関数を使用すると発生しない事は確認済
補足
回答ありがとうございます。 質問するのに最大文字制限があって書ききれてませんでした。 再確保したアドレスを使用して、そのあとの処理は行ってます。 途中省略してますが、こんな感じです。 --------------------------- for( i = 0 ; ; i++) { *pt2 = realloc( *pt2 ,sizeof(構造体) * (i+1) ); } これで、デバッグログを出力すると、、、 --------------------------- 【デバッグ情報】 pt1:変更されたポインタ変数 pt2:reallocによって再確保時使用ポインタ(ダブルポインタ) pt1->item1 :pt1の格納内容 pt1 <-内容 :pt1の格納しているアドレス値を表示 pt2 <-アドレス :pt2自身のアドレス値を表示 pt2 <-ア<-内容 :pt2の格納しているアドレス値を表示 pt2 <-ア<-ア :pt2の格納しているアドレス値が指し示す内容を表示 【ログ内容】 ---------- realloc前 pt1->item1 =[01]: pt1 <-アドレス =86733120: pt1 <-内容 =86781256: pt2 <-アドレス =1150176: pt2 <-ア<-内容 =92020460: pt2 <-ア<-ア =75746000: ---------- realloc後 pt1->item1 =[01]: pt1 <-アドレス =86733120: pt1 <-内容 =86781256: pt2 <-アドレス =1150176: pt2 <-ア<-内容 =92020460: pt2 <-ア<-ア =75746000: ※通常はこのようにpt1は何の影響も受けない ---------- realloc前 pt1->item1 =[01]: pt1 <-アドレス =86733120: pt1 <-内内容 =86781256: pt2 <-アドレス =1150176: pt2 <-ア<-内容 =92020460: pt2 <-ア<-ア =75746000: ---------- realloc後 pt1->item1 =[]: pt1 <-アドレス =86733120: pt1 <-内容 =959591986: pt2 <-アドレス =1150176: pt2 <-ア<-内容 =92020460: pt2 <-ア<-ア =86733120: ※realloc関数で再確保された領域がpt1のアドレスを上書きしている その為pt1の指し示す内容が変更されている と、こんな感じになってしまいます。。。 一体なぜ??? とハテナが一杯なんです。。。