2013-07-29 105 views
-2

在C修改串,我試圖編譯以下兩個代碼:
(1)使用字符指針

char a[] = "hello"; 
    a[1] = 'b'; 

(2)

char *a = "hello"; 
    a[1] = 'c'; 

首先編譯成功但第二給分段錯誤。我知道,在這兩種情況下,'a'代表字符指針。你能向我解釋兩種情況下的不同行爲嗎?事實證明,在第二種情況下,我可以使用[i]訪問元素,但無法更改它。

+2

請在這裏提問之前,閱讀任何有關C的基本書。 –

+0

第二種情況是未定義的行爲,因爲您試圖更改字符串文字的內容。 –

回答

4

問:我知道,在這兩種情況下,'a'代表字符指針。

沒有

因爲當你聲明爲char *a = "hello";然後a是常量字符串字面量指針並做a[i] = 'A';你特林寫只讀這是非法的內存。

而在第一次申報char a[] = "hello";a是任何陣列,其內容由字符串"hello"數組a[]近來可以在代碼中修改初始化。並做a[i] = 'A';是完全正確的。

問:首先編譯成功,但第二個給出分段錯誤。

您的代碼已編譯,因爲語法爲a[i] = 'A';是正確的。但在第一種情況下(char *a = "hello";)指令 a[1] = 'c';修改了非法內存運算符的常量字符串文字,此指令會導致運行時環境可檢測到的有效內存位置無效併發送終止信號SIGSEGV,從而導致程序終止分段錯誤。

+2

這是不正確的說,它是在只讀內存,它可能是但它是實現定義:http://stackoverflow.com/questions/2589949/c-string-literals-where-do-they-走 。你只能說這是'未定義的行爲'。 –

+0

@ShafikYaghmour是的,但它對大部分/標準編譯器是隻讀的,在閱讀你的答案後,我給你一個+。感謝您的鏈接:) –

+2

是的,目前大多數編譯器都會將字符串文字放在只讀內存中,但他們並不總是這樣做,我相信您仍然可以告訴他們不要這樣做。 –

2
char *a = "hello"; 

表示一個指向字符串常量,你嘗試在一個只讀存儲器位置寫入,因此你所得到的分割故障。

1

第二種情況是undefined behavior,您試圖修改字符串文字的內容。由於它是未定義的,它可以表現出任何行爲,包括似乎正常工作,但在這種情況下,你有一個分段錯誤。