【问题标题】:Why does my program exit the loop at a statement where I'm assigning a value to an array?为什么我的程序在我为数组赋值的语句中退出循环?
【发布时间】:2018-02-11 04:40:39
【问题描述】:

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

#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;

我不知道为什么。你能帮帮我吗?

谢谢

【问题讨论】:

  • 限制使用什么值?
  • 我使用了大于 5 小于 15 的整数。@coderredoc 解决了我的问题,但感谢您的帮助。

标签: c arrays c89


【解决方案1】:
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];

【讨论】:

  • 非常感谢!我一开始就初始化了我的数组,因为我认为在 c89 中我必须在启动程序之前初始化所有变量?我这样想错了吗?
  • @NihalKumar.:您使用的是 C89?它不支持 VLA。
  • 所以我不能使用 VLA 但我仍然可以在我的 printf/其他命令之后初始化变量?
  • @NihalKumar.:检查答案
【解决方案2】:
int i,a=0,b=1,c,limit,sum=1;
int fib[limit]; printf("Enter the number of terms: \n");
scanf("%d", &limit);

limit 在声明可变长度数组fib 时未初始化。 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 仍然无法工作。

【讨论】:

    【解决方案3】:

    你的代码有一些错误。

    限制值包含此行的垃圾值

    .....
    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”后,您已经初始化了数组

    现在您的代码将完美运行。& 正确评估斐波那契数列的总和。

    【讨论】:

      猜你喜欢
      • 2012-11-03
      • 2016-03-12
      • 1970-01-01
      • 2023-03-25
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-22
      相关资源
      最近更新 更多