2017-04-21 42 views
-3

考慮到這一代碼片段:爲什麼get()不接受char指針參數,如果它可以接受一個char數組?

#include <stdio.h> 

int main() 
{ 
    char *s; 
    gets(s); 
    printf("%s",s); 
    return 0; 
} 

我得到一個運行時錯誤在這種情況下,在stdin輸入一些輸入後。但是,如果s被聲明爲數組,s[size],則沒有問題。但考慮到gets原型,char *gets(char *s);不應該工作?

+2

你還沒有分配's'指向的內存。 – Barmar

+0

's = malloc(BUFSIZE);' – Barmar

+3

1)您是否閱讀過文檔?它**需要**'char *'。 2)**永遠不會使用'gets' **它已從標準中刪除,並且每個現代圖書館都會警告您嘗試使用它。 – Olaf

回答

2

gets函數希望s指向一個可以接受字符串的字符數組。但在這種情況下,s未初始化。因此gets試圖取消引用未初始化的指針。這調用undefined behavior

如果您要將s設置爲指向先前存在的陣列,或者如果您使用malloc來分配空間,則可以成功寫入它。

相反,如果s被定義爲一個數組,則在傳遞到gets時會衰減到指向數組第一個元素的指針。然後gets能夠寫入數組。

但請注意,gets是不安全的,因爲它不會嘗試驗證傳遞給它的緩衝區的大小。如果用戶輸入大於緩衝區的字符串,則gets將寫入緩衝區的末尾,這又會調用未定義的行爲。

你應該改用fgets,它接受緩衝區的大小作爲參數。

相關問題