[英]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.