为什么在c中调用函数时程序会崩溃?

时间:2014-11-05 22:46:24

标签: c function crash fibonacci

我最近不得不创建一个用户输入某个整数 N 的程序。之后,我的 int main()必须调用一个单独的函数, int getNextFibonacciNumber(void),它计算 N 中的 N 斐波纳契序列,然后打印出来。当我编译代码时,Vode :: Blocks表示没有任何错误或警告。这说,当我尝试运行程序时,它会自动崩溃。我已经阅读并重读了它,但我无法看到它出错的地方。有人能够对这个mysery有所了解吗?非常感谢你! 当程序崩溃时,它说:filename.exe已停止工作。一个问题导致程序停止正常工作。如果解决方案可用,Windows将关闭程序并通知您。 但是,当代码在Code :: Blocks中编译时, 一切都很好

#include <stdio.h>
#include <stdlib.h>

int getNextFibonacciNumber(void);

int main()
{
    int N, fibonacci[N];

    printf("Enter a positive integer:");
    scanf("%d", &N);
    printf("The %d th term in the Fibonacci sequence is: %d", N, getNextFibonacciNumber());
}

int getNextFibonacciNumber()
{
    int N, i, fibonacci[N];

    fibonacci[0] = 0;
    fibonacci[1] = 1;
    for(i = 2; i < N+1; i++)
    {
        fibonacci[i] = fibonacci[i-1] + fibonacci[i-2];
    }
    return(fibonacci[N-1]);
}

2 个答案:

答案 0 :(得分:0)

问题是,这个

int main()
{
    int N, fibonacci[N];

调用未定义的行为。 N未初始化,但用作C99可变长度数组大小说明符。从未初始化的变量中读取值会调用UB。

要修复此问题,您必须编写

int main()
{
    int N;

    printf("Enter a positive integer:");
    scanf("%d", &N);

    int fibonacci[N];

然而,还有另一个问题,即你在getNextFibonacciNumber中有相同的UB导致构造。你必须解决这个问题。输入N的数字也没有“传达”给getNextFibonacciNumber,所以我非常怀疑这个程序是否有效,即使它没有崩溃。

答案 1 :(得分:0)

Code :: Blocks(或者更确切地说,编译器Code :: Blocks调用)只会检查你是否已经写过&#34; legal&#34; c代码。它不会(也不能)检查你的程序是否符合你的要求,如果你的程序会在任何时候退出(或者只是永远运行),如果你的程序导致错误和崩溃等等。

当你说

  

int N,fibonacci [N];

我想你想要创建一个整数N和一个相同大小的数组。但是现在你创建一个整数N(有一些&#34;随机&#34;值,大概是0)和一个固定大小为N的数组。

如果你在程序的后期更改N,这不会影响阵列的大小&#34;斐波那契&#34;以任何方式。因此,如果你的N在程序开始时偶然为0而不是你创建了一个大小为0的数组。即使你从控制台输入读取一个值(比如5)。尝试读取和写入此数组会导致问题。

移动部件

  

int fibonacci [N];

低于你的&#34; scanf&#34; line会解决这个问题。此时N被初始化(而不是一些随机数)。

还要注意主函数中的变量N

  

int main()

中的N变量完全没有连接
  

int getNextFibonacciNumber()

第二个N是一个新创建的变量(再次设置为某些&#34;随机&#34;值)。如果要将数据从一个函数传递到另一个函数,则应将其作为括号中的参数传递:

  

int getNextFibonacciNumber(int N)