- ベストアンサー
Run-Time Check Failure #3エラーの解決方法
- C言語のプログラムでRun-Time Check Failure #3エラーが発生しました。
- このエラーは、変数'Data'が定義されていないまま使用されていることが原因です。
- 解決するためには、'Data'を適切に定義して初期化する必要があります。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
とりあえず、題名のエラーに付いてですが、 それは、mainの中での初期値を設定していない為に、 変数に不定値が入っていた為に起こった現象です。 で、#2に付いての質問ですが、まずは、main関数での宣言の DATA *Data ; は、アドレスを格納する変数と言うことです。 また、InputData関数の引数の DATA **Datに付いては アドレスを格納する変数のアドレスを引数とするという事です。 ですから、質問時のInputDataの引数の DATA *Datでは Datと言う変数のアドレスを受け取ると言うことで アドレスを格納する変数では無く、実体(値)を格納する変数となります。 で、#2のようにDATA **Datとすると *Datのアドレスを 受け取ると言うことになり、アドレスを格納する 変数と言うことに成ります。 (引数で記述するのはあくまでも変数宣言と同等です。) 以上が今回のエラー及びプログラムの間違いです。 (説明が下手で申し訳ありませんm(_ _)m) 詳しいアドレス及びポインタに付いては、C言語の 書籍にポインタに付いて記述されていると思いますので 探してみてください。 でも、ポインタに付いて詳しい説明をしている書籍って ・・・本1冊分になるような気がする(汗 それと、余計なアドバイスに成りますが、 ローカル変数とグローバル変数の違いもお勉強されると 良いかもしれませんね。 ローカル変数は、宣言するだけでは初期値は不定とかね。(だから、必ず初期化が必要なんです。) そうすれば、今回のエラーの意味もすぐにわかると思います。 これも、余計な事かもしれませんが、#2の お礼の部分に記述してあるプログラムに付いてですが、 せっかくですから、InputDataの中でデータと データの間に挿入すると処理を追加すれば、 DATA *Top; DATA *TopTmp; をmainで使用しなくても動作すると思います。 では、頑張って見て下さい。
その他の回答 (2)
- PS-biba
- ベストアンサー率66% (4/6)
#1です。 多分#1を直しても意図した動作には成らないと思います。 多分、意図した動作にするには下記の様にしないと・・ 領域確保の部分でおかしくなると思います。 後は、ソースを追って何が違うか考えてみてください。 ヒントは、ポインタの使い方です。 #include<stdio.h> #include<string.h> struct DATA { DATA *Small; DATA *Large; int Number; }; void InputData(DATA **Dat,int num) { if(*Dat==NULL){ *Dat=new DATA; memset( *Dat, '\0', sizeof( DATA )) ; (*Dat)->Number=num; return; } if((*Dat)->Number<num) { InputData(&((*Dat)->Large),num); } else if((*Dat)->Number>num) { InputData(&((*Dat)->Small),num); } return; } int main() { DATA *Data = NULL ; InputData(&Data,20); InputData(&Data,10); InputData(&Data,30); return 0; }
お礼
回答ありがとうございました。 遅くなりましてすみません。 一応できたのですが、意味は解っていません。 ポインタのポインタのところです。 #include<stdio.h> #include<string.h> struct DATA { DATA *Small; DATA *Large; int Number; }; void InputData(DATA **Dat,int num) { if(*Dat==NULL) { *Dat=new DATA; memset( *Dat, '\0', sizeof( DATA )) ; (*Dat)->Number=num; return; } if((*Dat)->Number<num) { InputData(&((*Dat)->Large),num); } else if((*Dat)->Number>num) { InputData(&((*Dat)->Small),num); } return; } void ShowData(DATA **Dat) { DATA **Tmp; Tmp = Dat; while (*Tmp) { ShowData(&(*Tmp)->Small); printf("%d ",(*Tmp)->Number); (*Tmp)=(*Tmp)->Large; } } int main() { DATA *Data = NULL ; InputData(&Data,20); DATA *Top; DATA *TopTmp; TopTmp=Top=Data; InputData(&Top,10); Top=TopTmp; InputData(&Top,30); Top=TopTmp; InputData(&Top,5); Top=TopTmp; InputData(&Top,8); Top=TopTmp; InputData(&Top,50); Top=TopTmp; InputData(&Top,1000); Top=TopTmp; InputData(&Top,-100); Top=TopTmp; ShowData(&Top); getchar(); return 0; }
- PS-biba
- ベストアンサー率66% (4/6)
ローカル変数の初期値は不定の為以下のように 初期化しないと InputData関数の if(Dat==NULL)は条件が一致せず、 Data領域をnewしないと思われますけど・・・ int main() { DATA *Data = NULL ;
お礼
たびたびありがとうございます。 意味もなんとなく解ってきました。 ちょっときれいなソースコードになりました。 ありがとうございました。 #include<stdio.h> struct DATA { DATA *Small; DATA *Large; int Number; }; DATA *InputData(DATA **Dat,int num) { if((*Dat)==NULL) { (*Dat)=new DATA; (*Dat)->Number=num; (*Dat)->Large=NULL; (*Dat)->Small=NULL; return (*Dat); } if((*Dat)->Number<num) { InputData(&(*Dat)->Large,num); } else if((*Dat)->Number>num) { InputData(&(*Dat)->Small,num); } return (*Dat); } void ShowData(DATA *Dat) { if(Dat==NULL){return;} ShowData(Dat->Small); printf("%d ",Dat->Number); ShowData(Dat->Large); } int main() { DATA *Data; Data=NULL; Data=InputData(&Data,10); InputData(&Data,5); InputData(&Data,15); InputData(&Data,-20); InputData(&Data,3); InputData(&Data,8); InputData(&Data,-50); ShowData(Data); getchar(); return 0; }