1

我刚开始使用 C 编程,我正在制作一个计算特定数量的斐波那契数的程序。它工作正常,除了我收到错误“分段错误(核心转储)”。我的代码有什么问题?

#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)顺便说一句。

提前致谢。

4

2 回答 2

5

您将越界访问fileNum仅分配了 2 个元素的静态数组。

因此,您是未定义行为的受害者。任何事情都可能发生,但在你的情况下,它最终会崩溃。

如果要存储生成的斐波那契数,那么最好在获取用户输入后动态分配数组。

于 2013-09-08T11:44:58.800 回答
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 中运行了你的代码,因为对向量位置的访问无效,它没有打印出我要求的所有数字。

现在,固定代码:

#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;
}
于 2013-09-08T14:47:52.430 回答