2011-02-04 61 views
6

我一直在試圖尋找下面的代碼失敗的原因,但我找不到一個。 所以,請原諒我的無知,讓我知道這裏發生了什麼。Char * p和scanf

#include<stdio.h> 
int main(void){ 
char* p="Hi, this is not going to work"; 
scanf("%s",p); 
return 0; 
} 

據我理解,我在尺寸29 + 1(對於\ 0)的存儲器中創建一個指針p以一個連續的區域。 爲什麼我不能使用scanf來更改它的內容?

P.S請改正我如果我說了一些關於char *的問題。

回答

14
char* p="Hi, this is not going to work"; 

這不分配內存爲你寫

這將創建一個String Literal其每次嘗試更改其內容的時間導致Undefined Behaviour

使用p作爲緩衝您scanf這樣做 char * p = malloc(sizeof(char) * 128); // 128 is an Example

OR

你還可做:

char p[]="Hi, this is not going to work"; 

我的猜測是你真正想做的事。

請記住,這仍然可以結束爲UB,因爲scanf()不檢查您使用的地方是否確實是有效的可寫內存。

記住:

char * p是一個字符串文字,不應該被修改

char p[] = "..."分配足夠的內存來保存"..."字符串裏面並且可以改變(其內容我的意思)。

編輯:

一個很好的辦法來避免UB

char * p = malloc(sizeof(char) * 128); 
scanf("%126s",s); 
-3

scanf()解析從stdin(通常是鍵盤)輸入的數據。我想你想要sscanf()

但是,scanf()的目的是分割預定義轉義序列的字符串,而您的測試字符串不具有這些轉義序列。所以這使得你不清楚你想要做什麼。

請注意,sscanf()需要額外的參數作爲第一個參數,它指定了正在分析的字符串。

+0

我認爲這個問題是爲什麼scanf不工作。通過Muggen解釋 – user210504 2011-02-04 16:37:54

+0

我發現OP的代碼有些問題,所以有點難以確切地知道他想要完成什麼。 – 2011-02-04 16:40:31

6

p指向一個常量字面,它實際上可能駐留在只讀存儲區(與實現相關)中。無論如何,試圖覆蓋未定義的行爲。即它可能導致什麼也沒有,或者立即崩潰,或者導致隱藏的內存損壞,這會在稍後導致神祕問題。 千萬不要那樣做

+1

@Downvoter,小心解釋一下? – 2011-02-04 16:38:33

0

它崩潰,因爲內存尚未分配的頁。爲p分配內存,它應該沒問題。你所擁有的是一個指向p的常量內存區域。當您嘗試在此數據段中寫入內容時,運行時環境將引發陷阱,從而導致崩潰。

希望這回答你的問題