2011-11-05 44 views
1

我寫這套短節目設置的char *的結束手動不起作用

int main(){ 
    char * c = "abcd"; 
    c[1] = '\0'; 
    cout << c << endl; 
} 

,它不工作...其實它編譯程序,但在錯誤occures運行時... 爲什麼?我認爲它會打印一個「a」,因爲「string」現在看起來像這樣:「a0cd」,所以在零後應該檢測到字符串的結尾,對吧?那麼問題在哪裏?

謝謝!

回答

8

您不能像這樣修改字符串文字。

試試這個:

int main(){ 
    char c[] = "abcd"; 
    c[1] = '\0'; 
    cout << c << endl; 
} 

這背後的原因是,字符串字面存儲在全局內存(通常在一個只讀段)。修改它們是未定義的行爲。但是,如果將它初始化爲數組char c[] = "abcd"它將在堆棧上(與全局內存相對),因此您可以自由修改它。

+0

謝謝。那麼究竟是什麼問題呢?你知道爲什麼不是的根本原因嗎? – Novellizator

+0

我已將原因編輯爲我的答案。 – Mysticial

+7

C標準對堆棧和全局內存沒有什麼可說的,這是一個實現問題。說明標準不允許修改字符串文字就足夠了。 – paxdiablo

1

如果你使用C++爲什麼不使用std::string::substr

#include <iostream> 
#include <string> 
int main() { 
    std::string c = "abcd"; 
    std::string d = c.substr(0,2); 
    std::cout << d << std::endl; 
    return 0; 
} 

程序的輸出:

ab 
+0

是的,我知道它也是這樣工作的,但我真的想嘗試它「低級別的方式」,看它是如何在語言的核心實際工作的... – Novellizator

+1

@Tomy:有趣的是,因爲95%的人認爲std :: string是爲C++跳過c的主要原因之一。字符串操作大多不是時間關鍵的,C字符串API非常模糊。 – Alex

+0

實際上,我在C++的代碼,我使用std :: string - 我的問題只是出於好奇 - 沒有更多:)謝謝反正 – Novellizator