- ベストアンサー
配列を使った乱数表示プログラムでコアダンプが発生する原因を教えてください
- 以下のプログラムをコンパイル、実行しようとするとコアダンプと表示されてしまいます。原因を教えていただきたいです。
- このプログラムは、Nを入力し、0~100までの乱数をN個表示させるものです。
- 配列を使っているのは、このプログラムが完成したのち、改良してその乱数同士を計算するプログラムにしたいためで、その途中段階でした。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>int i,N; >double u[N]; この段階で「Nは不定(たぶん、0になっている)」ので、配列の要素数も「不定(たぶん0個)」です。 「Nの値を入力し終わってから、配列を動的に確保する」か「配列の要素数を固定で取っておいて、配列の要素数を超えるNが入力されたら、入力エラーにする」ようにしましょう。 ・動的に確保する場合 #include <stdio.h> #include <math.h> #include <stdlib.h> int main(void){ int i,N; double *u; int ransu; printf("Define N : \n"); //得たい乱数の数を設定 scanf("%d",&N); u = (double *)malloc(sizeof(double)*N); if (!u) { printf("Out of memory.\n"); return 1; } for(i = 0; i < N; i++) { ransu = rand() % 101 ; //0~100までの乱数を得る u[i] = (double) ransu; printf("%.0f ", u[i]); } printf(" \n"); free(u); return 0; } ・要素数を固定(最大200個)にする場合 #include <stdio.h> #include <math.h> #include <stdlib.h> int main(void){ int i,N; double u[200]; int ransu; printf("Define N : \n"); //得たい乱数の数を設定 scanf("%d",&N); if ((N < 0) || (N > 200)) { printf("Illigal number.\n"); return 1; } for(i = 0; i < N; i++) { ransu = rand() % 101 ; //0~100までの乱数を得る u[i] = (double) ransu; printf("%.0f ", u[i]); } printf(" \n"); return 0; } あと、蛇足だけど「N」みたいな「大文字だけの変数名」や「1文字だけの変数名」は、なるべく使わない方が良い。 (「i」「j」「k」は「歴史的な慣習」なので、使っても良いが、出来るだけ使用は避けるべき)
その他の回答 (3)
- Wap58
- ベストアンサー率33% (29/87)
配列を使う意味がわからない サンプルソースで行きたいなら そのままだと配列数が未定義なので scanf("%d",&N);の後に double u[N];を宣言しましょう
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
因みに、配列をmallocで動的に確保する場合、Nに負数を入れられるとmallocがエラーになりNULLを返し、次のエラー判定でプログラムが停止するので、最初の回答では「Nが負数かどうかの判定を省略」しています。 回答No.2で書いたように「Nが負数なら、プログラムを終了する」など、きちんと判定した方が良いです。
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
追記。 メモリを動的に確保するように変更しても、Nに負数を入力されたら、forループが終わらなくなり、coreダンプするので、Nに負数を入れられた時の対処を追加しましょう。