繁体   English   中英

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

[英]Why does the program crash when the function is called in c?

我最近不得不创建一个程序,其中用户输入某个整数N。 之后,我的int main()必须调用一个单独的函数int getNextFibonacciNumber(void) ,该函数计算斐波纳契序列中的第N个项,然后进行打印。 当我编译代码时,Vode :: Blocks表示没有任何错误或警告。 这就是说,当我尝试运行该程序时,它会自动崩溃。 我已阅读并重新阅读,但看不到所有错误出在哪里。 谁能揭开这个谜团的神秘面纱? 非常感谢你! 程序崩溃时,它说: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]);
}

问题是,这

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 ,因此我高度怀疑该程序是否可以工作,即使它没有崩溃也是如此。

Code :: Blocks(或更确切地说是编译器的Code :: Blocks调用)仅检查您是否编写了“合法” c代码。 它不会(也不能)检查您的程序是否满足您的要求,程序是否会在任何时候退出(或只是永久运行),程序是否导致错误,崩溃以及类似的事情。

当你说

int N,斐波那契[N];

我猜您想创建一个整数N和一个相同大小的数组。 但是,现在您创建一个整数N(具有一些“随机”值,大概为0)和一个FIXED大小为N的数组。

如果您稍后在程序中更改N,则不会以任何方式影响数组“ fibonacci”的大小。 因此,如果在程序开始时N偶然是0,那么您已经创建了一个大小为0的数组。即使您从控制台输入中读取了一个值(例如5)。 尝试读写此数组会导致问题。

移动零件

int fibonacci [N];

在您的“ scanf”行下方将解决此问题。 此时,N被初始化(而不是随机数)。

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

int main()

函数中的N变量完全没有连接

int getNextFibonacciNumber()

第二个N是新创建的变量(再次设置为某个“随机”值)。 如果要将数据从一个函数传递到另一个函数,则应通过将其作为参数作为括号来传递它:

int getNextFibonacciNumber(int N)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM