- ベストアンサー
配列の受け渡し
全く原因が分からないので質問させていただきます. 次のようなプログラムがあります. メイン関数で配列を宣言して, これを関数funcに渡して,func内で処理を行う. その後,メイン関数でprintf()を使って配列の内容を表示させる. 私の書いたソースは次のようになっています. int main(void) { double data[]={1.0, 2.0, 3.0, 4.0}; for(i=0; i<4; i++) { printf("%f\n", data[i]); } func(data, 4); for(i=0; i<4; i++) { printf("%f\n", data[i]); } } void func(double *f, int n) { 配列に処理を行う } メイン関数の中で, 一つ目のprintf()はちゃんと配列dataの初期値を表示します. ところが,二つ目のprintf()の手前で, 「例外」とエラーがでてきます. (コンパイルは通っています.) これが何故なのか,さっぱり分かりません. 関数func()の最後にprintf()を書いてみたところ, ちゃんと処理を行った後の正しい値が表示されます. なので,関数func()自体にバグはないように思うのです. 原因が分かる方,いらっしゃいましたら, どうぞよろしくお願いします.
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
funcの中で配列の範囲外を書き換えているように思います。 funcを呼び出す前に配列の要素数を確認してみては? printf("%d\n",sizeof(data)/sizeof(data[0])); 質問のプログラムでは4になるはずですからfunc(data,5);なんてやっているとまずいことになりますね。 これが不具合として発覚するのは、funcを実行終わって関数から戻ってくるときになると思います。
その他の回答 (4)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
funcで配列を破壊していると思います。 どんなことをやっているか ソースを見せてもらえますか
- tatsu99
- ベストアンサー率52% (391/751)
関数funcで、double dataの配列を破壊していることが 考えられます。 試しに、関数funcの入り口で、直ちにreturn文を実行されてみては、如何でしょうか。 それで、二つ目のprintf()が正常であれば、関数funcが原因ということになります。 それでも、二つ目のprintf()が異常であれば、関数funcに問題はないということになります。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
mainの前に void func(double *f, int n); の宣言が必要です。 あるいは、#1の様に、定義を前に書きます。 質問文のプログラムの場合 関数の宣言がされていないので func(data, 4); が int func(int data, int n); のように解釈されています。
補足
回答ありがとうございます. No.1の方にも言いましたが, プロトタイプ宣言は行っていますので.
- anmochi
- ベストアンサー率65% (1332/2045)
mainとfuncの位置を逆にしてみよう。具体的には void func(double *f, int n) { ・・・ } int main(void) { ・・・・ } と言う風に、funcを上にする。
補足
回答ありがとうございます. 書くの忘れてましたが,プロトタイプ宣言はしていますので,大丈夫です.
お礼
はっきりしたことは分からないのですが, いろいろといじっていると何故か直りました. 皆様,回答ありがとうございました.