(物事を簡単にするため、私は入力を扱う無視するつもりです。)
最初の問題は、コンパイラの警告をオンです。ほとんどのCコンパイラは、デフォルトで警告を出すわけではありません。通常は-Wall
でコンパイルします。一度それをすれば、基本的な問題が明らかになります。
test.c:6:14: warning: variable 'n' is uninitialized when used here [-Wuninitialized]
int list[n];
^
test.c:5:10: note: initialize the variable 'n' to silence this warning
int n, i;
^
= 0
1 warning generated.
int list[n]
すぐにサイズnのリストを作成します。 n
は初期化されていないため、ガベージになります。あなたはそれが1551959272.
のようなものだから、どちらかn
を初期化する必要がある、またはあなたがn
変化に応じて動的list
を再割り当てする必要があるだろう、printf("%d\n", n);
と見ることができます。ダイナミックな割り当てと再割り当ては複雑になるので、静的なサイズにしましょう。
これを取得します。
#include <stdio.h>
#include <stdlib.h>
int main() {
/* Allocate an array of MAX_N integers */
const int MAX_N = 10;
int list[MAX_N];
/* Do Fibonacci */
for(int i = 2; i < MAX_N; i++) {
list[i] = list[i-1]+list[i-2];
}
/* Print each element of the list and its index */
for(int i = 0; i < MAX_N; i++) {
printf("%d\n", list[i]);
}
}
実行されますが、我々はゼロ(またはゴミ)が、何も得ること。フィボナッチアルゴリズムに問題があります。それはf(n) = f(n-1) + f(n-2)
で初期条件はf(0) = 0
とf(1) = 1
です。これらの初期条件は設定しません。 list
は決して初期化されないので、list[0]
とlist[1]
には、そのメモリの中にあったゴミが含まれます。
#include <stdio.h>
#include <stdlib.h>
int main() {
/* Allocate an array of MAX_N integers */
const int MAX_N = 10;
int list[MAX_N];
/* Set the initial conditions */
list[0] = 0;
list[1] = 1;
/* Do Fibonacci */
for(int i = 2; i < MAX_N; i++) {
list[i] = list[i-1]+list[i-2];
}
/* Print each element of the list and its index */
for(int i = 0; i < MAX_N; i++) {
printf("%d\n", list[i]);
}
}
これで機能します。ここで
0 0
1 1
2 1
3 2
4 3
5 5
6 8
7 13
8 21
9 34
あなたのコンパイラは 'int list [n];' n 'は初期化されていない、コンパイラの警告レベルを少し上げたいと思うかもしれません。また、フィボナッチシーケンス(インデックス0と1)の基本ケースを初期化していないので、それらの値が設定されていると思う場所が不明です。 – ShadowRanger
不確定の間、自動保存期間を持つオブジェクトの値を使用するための未定義の動作。 – EOF
どのような出力が得られますか?あなたは何をしたいですか? –