为什么我会收到错误“Segmentation fault(core dumped)”?

时间:2013-09-08 11:42:05

标签: c

我刚开始使用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。

提前致谢。

2 个答案:

答案 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;
}