2016-01-23 65 views
-5

說我有下面的代碼:爲什麼char *給我一個分段錯誤?

char* input; 
scanf("%s",&input); 
printf("%s\n",input); 

給出了一個分段故障而

char input[20]; 
scanf("%s",&input); 
printf("%s\n",input); 

給我任何錯誤。

+0

您在第一個示例中的指針指向「無處」(即指向某個隨機位置)。 – usr2564301

+0

@Jongware沒關係,他從不使用它的內容。而他的下一行代碼填充它。 –

+4

實際上,這兩個代碼段都不正確。第二個片段在它應該傳入'input'時將'&input'傳遞給'scanf'。 (編譯器應該生成一個警告,如果沒有,請調高警告級別。)格式說明符應限制字符數(因爲緩衝區很小)。正確的格式說明符將是'「%19s」'。代碼應該檢查'scanf'的返回值。如果'scanf'失敗,那麼'input'將被初始化,並且'printf'將顯示未定義的行爲。所以我看到它,你在三行代碼中有三個錯誤。 – user3386109

回答

2
char* input; 
scanf("%s",&input); 
printf("%s\n",input); 

讓我們一行一行吧。

  1. 好的,所以inputchar *
  2. 但我們讀入一個字符串。

所以我們有足夠的空間指向一個字符的指針,但是然後我們嘗試存儲,然而很多字符都是在那裏輸入的。因此,如果輸入的字符數多於用於存儲指向角色的指針數,則會崩潰。

如果你想存儲一個字符串,你需要爲字符串分配空間,就像你在第二個例子中給出的那樣沒有錯誤。只要將中間線改爲scanf("%s",input);即可。你想input衰減到一個指向其內容的指針。

+2

他的第二個例子也是錯誤的。他將'scanf'用於'&input',其中'char input [20]'。 –