2012-02-17 66 views
0

我有這個與指針的運動:這個解除引用聲明有什麼問題?

char *str = "Hello"; 
int count = 0; 
int len = 5; 
printf("%c\n", *(str + count)); 
printf("%c\n", *(str + len - count - 1)); 
*(str + count) = *(str + len - count - 1); 

兩個*(str + count)*(str + len - count - 1)是爲printf小號鑑證有效值(我得到Ho)。那麼爲什麼我在運行上述時得到bus error

+1

'str'從哪裏來? – 2012-02-17 02:38:32

+2

'char'數組的大小是多少,'count'和'len'的值是多少? – 2012-02-17 02:40:14

+0

隨着你增加'count',一個參考將移動一個方向,另一個參考。我猜你正走在陣列的盡頭,可能是在前端。 – 2012-02-17 02:46:12

回答

3

str指向一個字符串文字,它駐留在內存中,它是未定義的行爲來寫入。很多時候,編譯器會將這些字符串文字放入內存中,但不包含寫入權限。這就是你崩潰的原因。

它更改爲這樣:

char str[] = "Hello"; 

這將在堆棧上創建一個數組,並與C-串"Hello"初始化它;由於它駐留在堆棧上,因此可以自由修改它。

+0

任何想法爲什麼它是一個'總線錯誤',而不是隻是*分段錯誤*? – kaoD 2012-02-17 02:56:34

+0

@kaoD nope,不知道。儘管寫入字符串文字是Undefined Behavior,但絕對會發生任何事情,包括總線錯誤或大氣爆炸。 – 2012-02-17 02:56:59

+0

然後,我完全寫了一個無限的叉子和碰撞循環...並觀看世界的燃燒! ;) – kaoD 2012-02-17 03:00:29