2014-06-21 53 views
0

我嘗試下面的代碼,並得到了分割容錯與fgets中的fputs給分段錯誤

int size=30; 
    char *str; 
    fputs(fgets(str,size,STDIN),STDOUT); 

但是當我運行這是 -

buff=fgets(str,size,STDIN); 
    fputs(buff,STDOUT); 

它工作得很好。此外,第一個代碼運行,如果我使用malloc的str。我無法理解這是如何發生的。

+2

我懷疑fgets'的'返回使用內部緩衝區(或者一些具體的編譯器優化效果(魔法))。在你的第一種情況下,你沒有任何緩衝區,因爲'str'只是一個指針而不是緩衝區。 – ilent2

回答

5

你的問題就在這裏:

char *str; 
// de-referenece str in ANY way. 

您有可能在任何地方指着的指針。像這樣訪問任意內存是未定義的行爲。

,它工作在一種情況下而不是其他,純屬巧合,你應該提供一個適當的緩衝喜歡這樣的事實:

char str[100]; // or whatever size you need. 

或使用malloc動態分配內存,因爲你已經發現。

一旦你進入未定義行爲的陰暗世界中,所有的賭注都關閉。

它可能會崩潰,它可能工作,它可能會導致飛豬或鼻惡魔或當地的時空區域的塌陷成一個奇點。底線,不要做:-)

+0

據我所知,但不'的fputs(與fgets(STR,大小,STDIN),STDOUT);'&'拋光輪=與fgets(STR,大小,STDIN); fputs(buff,STDOUT); ' 一樣的東西? – Imdad

+0

是的,沒有。它們都是未定義的行爲,但它們可能有不同的結果,這就是UB的全部觀點。事實上,完全相同的UB代碼完全有權今天做一件事,明天做另一件事。在你使用UB的那個時候,根據我的最後一段,所有投注都關閉。 – paxdiablo

+0

我在哪裏可以瞭解內部工作?建議,如果有的話。因爲我不能從手冊頁得到很多。提前致謝 – Imdad