我最近不得不创建一个用户输入某个整数 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]);
}
答案 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)