• ベストアンサー

配列の受け渡し

全く原因が分からないので質問させていただきます. 次のようなプログラムがあります. メイン関数で配列を宣言して, これを関数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()自体にバグはないように思うのです. 原因が分かる方,いらっしゃいましたら, どうぞよろしくお願いします.

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

funcの中で配列の範囲外を書き換えているように思います。 funcを呼び出す前に配列の要素数を確認してみては? printf("%d\n",sizeof(data)/sizeof(data[0])); 質問のプログラムでは4になるはずですからfunc(data,5);なんてやっているとまずいことになりますね。 これが不具合として発覚するのは、funcを実行終わって関数から戻ってくるときになると思います。

その他の回答 (4)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.5

funcで配列を破壊していると思います。 どんなことをやっているか ソースを見せてもらえますか

yassan_yassan
質問者

お礼

はっきりしたことは分からないのですが, いろいろといじっていると何故か直りました. 皆様,回答ありがとうございました.

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.4

関数funcで、double dataの配列を破壊していることが 考えられます。 試しに、関数funcの入り口で、直ちにreturn文を実行されてみては、如何でしょうか。 それで、二つ目のprintf()が正常であれば、関数funcが原因ということになります。 それでも、二つ目のprintf()が異常であれば、関数funcに問題はないということになります。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

mainの前に void func(double *f, int n); の宣言が必要です。 あるいは、#1の様に、定義を前に書きます。 質問文のプログラムの場合 関数の宣言がされていないので func(data, 4); が int func(int data, int n); のように解釈されています。

yassan_yassan
質問者

補足

回答ありがとうございます. No.1の方にも言いましたが, プロトタイプ宣言は行っていますので.

  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.1

mainとfuncの位置を逆にしてみよう。具体的には void func(double *f, int n) { ・・・ } int main(void) { ・・・・ } と言う風に、funcを上にする。

yassan_yassan
質問者

補足

回答ありがとうございます. 書くの忘れてましたが,プロトタイプ宣言はしていますので,大丈夫です.

関連するQ&A