2012-08-10 53 views
0

可能重複:
Why does this Seg Fault?對char分割故障++運算符*

我在一個char *

#include<stdio.h> 

int main() 
{ 
    char *s = "hello"; 
    printf("%c ", ++(*s)); 
    return 0; 
} 

使用++運算符時收到分段錯誤但是,如果我做到以下幾點:

#include<stdio.h> 

int main() 
{ 
    char *s = "hello"; 
    char c = *s; 
    printf("%c ", ++c); 
    return 0; 
} 

然後代碼編譯完美,上面的代碼有什麼問題?

回答

5

第一代碼段正試圖以改變一個字符在字符串文本:

++(*s) 

試圖遞增的第一個字符在s。字符串文字是(通常)只讀的,並且嘗試修改會導致分段錯誤(C標準狀態如果程序試圖修改這樣的數組,則行爲不確定。)。

第二代碼段修改char變量,它不是隻讀如後:

char c = *s; 

c複製的第一個字符的sc可以安全地遞增。

2

在第一種情況下,您修改常量字面量,並在第二種情況下修改變量。

2

此代碼:

printf("%c ", ++(*s)); 

試圖修改字符串文本通過一個指向它的字符中的一個。修改字符串文字是未定義的行爲 - 很可能的結果是字符串文字通常存儲在只讀內存中,所以修改它們在技術上是非法的,這就是爲什麼它在系統上表現爲分段錯誤。

1

char * s =「hello」;

這意味着's'是一個常量字符串。

如果你需要一個非常量字符串,你應該從堆中明確地分配它。

1

您正在嘗試更改不允許的第一種情況下的字符串文字。在第二種情況下,您將從字符串文字的第一個字符創建一個新的字符。您修改該字符的副本,這就是第二種情況的原因。

0

您的代碼對於存儲字符串文字的段沒有寫入權限。