2013-08-03 109 views
-1

我試圖瞭解過程中在位置* P =「Z」分段故障*分配

void main() 
{ 
    char *p ="abcdefg"; 
    *p = 'Z'; 
} 

當谷歌搜索,我發現很多鏈接到以下程序的char *分配分割故障回答如下 1.這是一個字符串文字,一旦賦值不能改變它的值 2.字符串文字不能被分配到* p 3.帶一個malloc可以被改變......等等......

但我的擔心是如果字符串文字值不能改變,因爲它是恆定的,怎麼來當我們改變一個整數的常量值時,我們不會出現分段錯誤。 有人可以幫助我更好地理解這一點嗎?

-Prashanth

+1

看一看:http://stackoverflow.com/questions/718477/string-literals – loxxy

+0

我假設你已經聽說過字符串文字通常稱爲字符串常量。 「恆定」這個詞的哪個部分你不明白? – 2013-08-03 12:22:33

+0

相同的字符串文字概念是否適用於整數? #include void main() { int * a = 123456; * a = 1; } – pkumarn

回答

1

這是未定義的行爲。如果您有一個常量字符串,則標準說明可能不會修改字符串文字。因此它是否可寫取決於體系結構,它可能會或可能不會出現段錯誤。

更新已從評論添加。

+0

「它放在數據段」也取決於體系結構,不要做出假設。 「這是不確定的行爲」本身就足夠了;可能會追加「因爲標準說字符串文字可能不會被修改」,以獲得更好的答案。 – 2013-08-03 12:24:19

+0

@ H2CO3,我更新了我的答案。 – Devolus

+0

我明白了,謝謝。 – 2013-08-03 12:27:27

-1

這是因爲您正在使用*進行分配。您的代碼基本上顯示爲:p的地址pointer類型爲char的商店值Z.

+1

「在類型指針的p的地址處」 - 除非它不是,「* p」將指針p解除引用,因此該賦值嘗試更改第一個字符的值,該值不應該被修改,因爲它是字符串文字的一部分。 – 2013-08-03 12:20:30

0
char *p ="abcdefg";// p is pointing a read only memory. 
    *p = 'Z';  //You want write a read memoty . 
+0

錯誤。 「abcdefg」存儲在內存中的某處。 '* p'是指向該地址的指針。 – ep0

+2

@ ep0不,你的解釋是錯誤的。 '*'運算符將引用指針。 – 2013-08-03 12:19:29

0

第一*爲點變量,這意味着p是一個點,它指向一個char,所以INT * p是指向一個整數值的點,這是點變量。 p,not * p,是一個點,它的值是內存中char值的地址,你可以通過printf(「p =%d」,p)來測試它。 p包含* p的值或char變量。所以,可以說* =「指針指向的值...」,並且& =「內存中值的地址...」。所以,而不是char * p,temp;溫度= 'A'; * p = temp;(指針p指向變量temp的值相等的值)