2012-12-23 35 views
-1

可能重複:
Why does char* cause undefined behaviour while char[] doesn’t?不能修改堆棧串在C

以下代碼

int main() { 
    char * st = "abc"; 
    *st = 'z'; 
    return 0; 
} 

返回一個段故障。如果堆棧中的字符串不可修改,爲什麼它在編譯時沒有提供錯誤?

+3

字符串文字是隻讀的。聲明一個char *數組*。這是一個**非常**的常見問題,順便說一句。查看[這個問題](http://stackoverflow.com/questions/8302290/why-does-char-cause-undefined-behaviour-while-char-doesnt/8302326#8302326),例如。 – WhozCraig

+3

字符串不在堆棧上。它在數據段中。 (指向字符串的指針在堆棧上)。 –

+1

由於兼容性原因,它沒有給出編譯時錯誤。 ''abc''的類型實際上是'char const [4]',它會給編譯器提供一個錯誤。 –

回答

2

棧st上的變量是一個指針。分配的值是一個字符串常量(只讀)。

1

char *str = "this is dangerous to modify";不是您獲得同樣意義的字符串;它被稱爲字符串文字並根據標準修改它會產生未定義的行爲。

如果你想有一個字符串,您可以稍後修改,是這樣的:

char str[] = "Some String"; 

然後相應地修改它。