2016-01-24 64 views
0
int main(void) { 
    // your code goes here 
    char* qwe = "qwe"; 
    qwe[2] = '\0'; 
    printf("%s\n", qwe); 
    return 0; 
} 

我一直在搞C指針,看看我是否正確理解它們。 從代碼qwe包含char指針 字母'q', and can reach to 'w', 'e''\0'qwe[2] = *(qwe + 2),這是e。我用'\0'終止了它。現在,當我嘗試打印它時,它給了我一個分段錯誤。我期待輸出qw0終止它後打印C字符串

+2

並非所有的內存地址是可寫的,一種情況是其分配給您的字符串文字編譯器的地址。 –

+0

不,'qwe'是一個**指針**。它不是因爲你在每一本好C書和教程中找到的原因而被稱爲「數組」。 (而_array_也不是指針)。 – Olaf

回答

3

您得到的段錯誤不是因爲打印,而是因爲您嘗試寫入一個字符串文字的內存。如果你做一個拷貝到可寫內存,您的代碼將工作:

int main(void) { 
    char qwe[] = "qwe"; 
    // ^^^^^ 
    qwe[2] = '\0'; 
    printf("%s\n", qwe); // prints "qw" 
    return 0; 
} 
+0

你不能修改字符串文字的原因是因爲編譯器可以將它放在代碼段中。 'char'數組像其他局部變量一樣。 – e0k

+0

我明白了,我應該研究什麼才能更瞭解這個概念?我的問題不夠清楚,應該得到一個大拇指嗎? – lostdong12

+0

@ lostdong12沒有特別的概念,字符串文字是語言中的特例。而且,儘管未定義的行爲會使你的代碼在很多編譯器上工作,這會使程序不合格。一般來說,未定義的行爲值得閱讀,以瞭解相同的程序如何在某些系統上工作,並打破其他系統。至於降薪,我不認爲這是完全公平的,因爲這種行爲不容易理解。 – dasblinkenlight