簡體   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