2013-06-28 73 views
3

請解釋爲什麼我使用++運算符來獲得段錯誤。明確加1和使用++運算符有什麼區別?爲什麼我在使用++時遇到seg故障,但在使用「1 +」時不會出現故障?

using namespace std; 
#include <iostream> 

int main() { 

    char* p = (char*) "hello"; 

    cout << ++(*p) << endl; //segfault 
    cout << 1 + (*p) << endl; // prints 105 because 1 + 'h' = 105 

} 
+7

'++(* p)'嘗試修改字符串本身。你不能這樣做,因爲它是一個字符串。鑄造到'char *'(來自它的原始'const char *')首先是錯誤的。 – jogojapan

+0

我不認爲這完全正確。在閱讀下面這個人的回答之後,我想我實際上是在嘗試修改字符字面值,而不是字符串字面值,因爲在我實際調用++運算符之前(* p)返回字符'h'。 –

+1

你的代碼中只有一個文字:'「hello」'(除了'1',但這不相關),這是一個字符串文字。 '* p'指向該文字中的一個字符的地址。您嘗試修改地址指向的值。如果您要成功完成此操作,您將修改該字符,因此 - 因爲它是您的代碼中定義的字符串字面值的一部分 - 您將會修改字符串字面值。 – jogojapan

回答

8

因爲你想增加一個常量。

char* p = (char*) "hello"; // p is a pointer to a constant string. 
cout << ++(*p) << endl;  // try to increment (*p), the constant 'h'. 
cout << 1 + (*p) << endl; // prints 105 because 1 + 'h' = 105 

換句話說,所述++操作者試圖以遞增p是指向字符,然後更換用新的原始值。這是違法的,因爲p指向常量字符。另一方面,簡單地加1不會更新原始字符。

+0

真棒簡潔的答案,很好地解釋了這個問題。 +1 –

+0

特別是,當程序由os啓動時,該字符串將從可執行文件中讀出並加載到只讀的內存頁面中。 – antiduh

+1

所以基本上我說的是'h'='h'+ 1? 現在我感覺很遲鈍...大聲笑我不能相信這個問題沒有被放棄投票。 儘管如此,我並沒有嘗試修改字符串字面值,對吧?我試圖修改字符文字,因爲(* p)在調用++運算符之前返回字符'h'。我是對的還是...? –

2

您不能修改C風格的字符串文字。這就是++(*p)正在做的事情。