我刚开始使用C编程,我正在编写一个程序来计算特定数量的Fibonacci数。它工作正常,除了我收到错误“Segmentation fault(core dumped)”。我的代码出了什么问题?
#include <stdio.h>
int main() {
int max;
long long int fiNum[] = {1, 1};
printf("How many numbers do you want to get? ");
scanf("%d", &max);
int i = 1;
long long int x;
while ( i < max ) {
x = fiNum[i] + fiNum[i-1];
printf("%lld ", x);
i++;
fiNum[i] = x;
}
printf("\nDone!\n");
return 0;
}
当我要求让10个数字输出时:
2 3 5 8 13 21 34 55 89
Done!
Segmentation fault (core dumped)
我正在使用Linux(Ubuntu)btw。
提前致谢。
答案 0 :(得分:5)
您将越界访问仅分配了2个元素的静态数组fileNum
。
因此,您是未定义行为的受害者。任何事情都可能发生,但在你的情况下,它最终会崩溃。
如果要存储生成的斐波纳契数,那么在从用户那里获得输入后,最好动态分配数组。
答案 1 :(得分:1)
因为你说你是C初学者,这里有一些提示:):
#include <stdio.h>
int main () {
/*When you program in C, try to declare all your variables at the begining of the code*/
int max;
long long int fiNum[]={1,1}; /* malloc! It is allways the solution and the problem too, but stick with malloc
something like fiNum = malloc (n*sizeof(long int)); I never malloc a long int
so just verify if its like this...
*/
long long int x;
int i=1; /*Try to only initializes loop variables inside the loop, like: for(i=1; i< max; i++){}*/
printf("How many numbers do you want to get? ");
scanf("%d",&max);
printf("max: %d\n", max);
while (i<max) { /*Here you could use a for loop*/
printf("i value: %d\n",i);
x=fiNum[i]+fiNum[i-1];
printf("%lld ",x);
i++;
fiNum[i]=x;
}
printf("\nDone!\n");
return 0;
}
Obs。:我在我的linux中运行了你的代码,因为对vector位置的无效访问,它没有打印出我提出的所有数字。
现在,固定代码:
#include <stdio.h>
#include <stdlib.h>
int main () {
int max;
int i;
long long int *fiNum;
printf("How many numbers do you want to get? ");
scanf("%d",&max);
fiNum = malloc(max*sizeof(long int));
fiNum[0] = 1;
fiNum[1] = 1;
for (i = 1; i < max-1; i++)
fiNum[i+1] = fiNum[i]+fiNum[i-1];
for (i = 0; i < max; i++)
printf("fi[%d]: %d\n", i+1, fiNum[i]);
printf ("\nDone!\n");
return 0;
}