我嘗試下面的代碼,並得到了分割容錯與fgets中的fputs給分段錯誤
int size=30;
char *str;
fputs(fgets(str,size,STDIN),STDOUT);
但是當我運行這是 -
buff=fgets(str,size,STDIN);
fputs(buff,STDOUT);
它工作得很好。此外,第一個代碼運行,如果我使用malloc的str。我無法理解這是如何發生的。
我嘗試下面的代碼,並得到了分割容錯與fgets中的fputs給分段錯誤
int size=30;
char *str;
fputs(fgets(str,size,STDIN),STDOUT);
但是當我運行這是 -
buff=fgets(str,size,STDIN);
fputs(buff,STDOUT);
它工作得很好。此外,第一個代碼運行,如果我使用malloc的str。我無法理解這是如何發生的。
你的問題就在這裏:
char *str;
// de-referenece str in ANY way.
您有可能在任何地方指着的指針。像這樣訪問任意內存是未定義的行爲。
,它工作在一種情況下而不是其他,純屬巧合,你應該提供一個適當的緩衝喜歡這樣的事實:
char str[100]; // or whatever size you need.
或使用malloc
動態分配內存,因爲你已經發現。
一旦你進入未定義行爲的陰暗世界中,所有的賭注都關閉。
它可能會崩潰,它可能工作,它可能會導致飛豬或鼻惡魔或當地的時空區域的塌陷成一個奇點。底線,不要做:-)
我懷疑fgets'的'返回使用內部緩衝區(或者一些具體的編譯器優化效果(魔法))。在你的第一種情況下,你沒有任何緩衝區,因爲'str'只是一個指針而不是緩衝區。 – ilent2