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