为什么我的程序在我为数组赋值的语句处退出循环?

Why does my program exit the loop at a statement where I'm assigning a value to an array?

我写了一个简单的程序来打印斐波那契数列直到某个值,将它存储在一个数组中并计算它的总和。

#include<stdio.h>
int main()
{
    int i,a=0,b=1,c,limit,sum=1;
    int fib[limit];
    printf("Enter the number of terms: \n");
    scanf("%d", &limit);
    fib[0]=0;
    fib[1]=1;
    printf("0 \n");
    printf("1 \n");
    for(i=2; i<limit; i++)
    {
        c=a+b;
        printf("%d \n",c);
        fib[i]=c;
        a=b;
        b=c;

    }
    for(i=0; i<limit; i++)
    {
        sum+=fib[i];
    }
    printf("The sum is %d", sum);

    }

但它直到达到极限才输出系列,我相信这条线可能是原因。

fib[i]=c;

虽然我不确定为什么。你能帮帮我吗?

谢谢

int fib[limit];
printf("Enter the number of terms: \n");
scanf("%d", &limit);

将会

printf("Enter the number of terms: \n");
scanf("%d", &limit);
int fib[limit];

否则,您将使用具有不确定内容的变量声明 VLA。这是未定义的行为。在您的情况下,程序在您尝试使用它时崩溃了。

如果您在 C89 中,则需要使用某个最大值初始化大小,因为 C89 不支持 VLA。

void MAXLIMIT 1000
...

int fib[MAXLIMIT];
int i,a=0,b=1,c,limit,sum=1;
int fib[limit]; printf("Enter the number of terms: \n");
scanf("%d", &limit);
当您声明可变长度数组 fib 时,

limit 未初始化。 limit 可以是任何值。这意味着长度是未知的,这肯定会引起问题。这是未定义的行为。

此外,我注意到您用 C89 标记了它。在 1989 年的标准中,可变长度数组是不允许的。任何符合标准的编译器都会拒绝编译它,或者至少会发出严厉的警告。不过,C99 标准中允许使用 VLA。

int i,a=0,b=1,c,limit,sum=1;
printf("Enter the number of terms: \n");
scanf("%d", &limit);
int fib[limit];

如果你这样做,它会工作得很好,并且是完全有效的 C99。由于 VLA 以及 fib 未在 printfscanf.

之前定义的事实,C89 仍然无法工作

你的代码有一些错误。

限制值包含此行的垃圾值

.....
int i,a=0,b=1,c,limit,sum=1;
....

& 然后你用垃圾值的大小初始化一个数组。

....
int fib[limit];
....

之后你将 'limit' 值作为数组的大小。

....
printf("Enter the number of terms: \n");
scanf("%d", &limit);
....

但您可以在获取极限值之前初始化数组。

所以正确的代码是,

    ....
    printf("Enter the number of terms: \n");
    scanf("%d", &limit);
    int fib[limit];
    ....

您在获取数组大小后初始化了数组 'limit'

现在您的代码将完美运行。斐波那契数列的总和已正确计算。