2010-08-26 23 views
0
#include<stdio.h> 

void f(void) 
{ 
    int s = 0; 
    s++; 
    if(s == 10) 
     return; 
    f(); 
    printf("%d ", s); 
} 
int main(void) 
{ 
    f(); 
} 

該程序的輸出是什麼! 我m分段故障......它是什麼?該程序的輸出

+1

是什麼阻止你在逃避嗎? – codaddict 2010-08-26 17:43:10

+5

然後輸出是分段錯誤錯誤。 – BoltClock 2010-08-26 17:43:13

+2

就是這樣!!!!!!!! – 2010-08-26 17:50:58

回答

4

這裏的問題是,你沒有靜態初始化s。所以它會總是開始爲0,每次你打電話f(),和f()不斷調用自己一遍又一遍,但從來沒有滿足if(s == 10)。調用堆棧最終溢出和繁榮,分段錯誤。

1

你的程序是一個無限循環;你會得到分段錯誤,因爲你最終會溢出你的堆棧。

2

問題是你遞歸地調用f,每次都不改變任何東西。你可能會遇到堆棧溢出。

每當您撥打f時,都會將s初始化爲0並對其進行增加。它永遠不會達到10.

你應該做的是或者使s參數爲f或者使s靜態。

6

由於s是一個局部變量,因此每次遞歸調用f()都會獲得它自己的副本。因此,每次s都將是1,並且您會收到堆棧溢出異常。

0

如何使變量s靜態?

1

該程序進入無限循環。 原因是: s對f()是局部的,因此每當調用f()時,s都被初始化爲0.然後它被加1,再次調用f()。這一次,f()使用其本地副本&將s初始化爲0 &再次以遞歸方式調用f()。這會產生無限循環&該程序會產生分段故障。由於遞歸無限調用,seg故障的原因是堆棧溢出。 要解決此問題,請將其設爲靜態或使其成爲全局,而不是本地。

0

這是一個自我調用的遞歸函數。但是,這是一個無限循環,因爲每次調用計數器時,int s = 0;都會重置計數器。它將打印一個無窮無盡的0行。

樣品溶液:

int main (void) { 
    f(0); 
} 

void f (int s) { 
    if (s == 10) 
     return; 
    printf("%d ", s); 
    f(s++); 
} 

我不擅長與C語法,但這個想法是合理的。

0

無限循環。這可能是類似的東西你想

#include<stdio.h> 

void f(int s) 
{ 
    s++; 
    if(s == 10) 
     return; 
    f(s); 
    printf("%d ", s); 
} 
int main(void) 
{ 
    f(0); 
} 
0

這可能是一個更有趣的節目是什麼:

void f(int s) 
{ 
    s++; 
    if(s == 10) 
    return; 
    f(s); 
    printf("%d ", s); 
} 

int main(void) 
{ 
    f(0); 
} 

,將打印:

9 8 7 6 5 4 3 2 1

+0

或者你可以只聲明'static int s = 0;'而是。 – torak 2010-08-26 18:41:05

0

這個程序的輸出是這個網站的名稱。

正如其他人建議應聲明s作爲static int s = 0