2010-05-27 277 views
3

我有兩個指向相同C字符串的指針。如果我將第二個指針加1,並將第二個指針的值賦給第一個指針,我期望第一個字符串的第一個字符被改變。例如:使用指針簡單修改C字符串

#include "stdio.h" 

int main() { 
    char* original_str = "ABC";  // Get pointer to "ABC" 
    char* off_by_one = original_str; // Duplicate pointer to "ABC" 
    off_by_one++;      // Increment duplicate by one: now "BC" 
    *original_str = *off_by_one;  // Set 1st char of one to 1st char of other 
    printf("%s\n", original_str);  // Prints "ABC" (why not "BBC"?) 
    *original_str = *(off_by_one + 1); // Set 1st char of one to 2nd char of other 
    printf("%s\n", original_str);  // Prints "ABC" (why not "CBC"?) 

    return 0; 
} 

這是行不通的。我確信我錯過了一些明顯的東西 - 我對C的使用非常非常少。

感謝您的幫助!

回答

10

您正試圖修改字符串文字。字符串文字不可修改(即它們是隻讀的)。

試圖修改字符串文字的程序表現出未定義的行爲:程序可能能夠「成功」修改字符串文字,程序可能會崩潰(立即或稍後),程序可能會顯示異常並且意外的行爲或其他可能發生的事情。當行爲未定義時,所有投注均關閉。

你的代碼聲明original_string作爲指向字符串字面"ABC"

char* original_string = "ABC"; 

如果將其更改爲:

char original_string[] = "ABC"; 

你要善於去。這聲明瞭一個char的數組,它使用字符串文字"ABC"的內容進行初始化。數組自動被賦予四個元素的大小(在編譯時),因爲這是保存字符串文字(包括空終止符)所需的大小。

+0

很好,謝謝! – Kiwi 2010-05-27 13:24:23

+0

它如何不可修改?我並不爭論它,但我想知道是什麼讓字符串字面不變。編譯器是否執行它?如果是這樣,那麼爲什麼這不是一個編譯器錯誤?文字是否位於操作系統標記爲只讀的內存塊中? – 2010-05-27 13:33:52

+0

@A。 Levy:它是「不可修改的」,因爲語言標準規定修改字符串文字會導致未定義的行爲。在許多實現中,字符串文字被放置在某些標記爲只讀的內存塊中,因此如果您嘗試寫入,則會出現某種分段錯誤或訪問衝突。 – 2010-05-27 13:47:57

1

問題是,您不能修改只讀的文字「ABC」。

嘗試char[] original_string = "ABC",它使用一個數組來保存您可以修改的字符串。