2010-11-20 59 views
8
int main() 
{ 
     char *temp = "Paras"; 

     int i; 
     i=0; 

     temp[3]='F'; 

     for (i =0 ; i < 5 ; i++) 
       printf("%c\n", temp[i]); 

     return 0; 
} 

爲什麼temp[3]='F';會導致分段錯誤,因爲temp不是const爲什麼以下會產生分段錯誤?

+3

因爲您的C/OS實現非常慷慨,並且在調用未定義的行爲時立即終止程序,而不是在您的鼻子上召喚惡魔力量。 – 2010-11-20 03:43:17

回答

9

您不允許修改字符串文字。

+0

但是'temp'不是'const' – cse 2010-11-20 03:15:11

+0

是的。我認爲編譯器應該警告你,但是,例如,gcc不會。無論哪種方式,該標準都允許編譯器將字符串常量放入只讀存儲器中。 – 2010-11-20 03:16:29

+0

那爲什麼'char temp [6] =「Paras」;'有效? – cse 2010-11-20 03:25:30

0

* temp定義爲指向常量的指針(有時稱爲字符串文字 - 尤其是在其他語言中)。

因此,帶有錯誤的行試圖更改此常量的第三個字符。

嘗試定義一個char數組並使用strcpy將temp複製到它。然後在數組上執行上面的代碼,它應該可以工作。 (抱歉,我這裏ipad不喜歡代碼插入到SO的接口)

+2

我知道這種感覺。我認爲SO開發者應該考慮iPad用戶的未來。 – 2010-11-20 03:37:17

0

正如你所看到的,temp是一個指針,它指向一個隨機地址,其中無名陣列與價值Paras所在。那個數組是一個字符串常量。

你的程序工作,你需要使用一個數組,而不是指針:

char temp[6] = "Paras"; 

現在,如果你想知道爲什麼它是temp[6]代替temp[5],上面的代碼初始化字符串,並完全不同於:

char temp[5] = {'P', 'a', 'r', 'a', 's'}; 

字符串以空終止符\0終止。和字符串初始化會像:

char temp[6] = {'P', 'a', 'r', 'a', 's', '\0'}; 
+4

更好的是,'char temp [] =',所以編譯器會計算出長度。 – 2010-11-20 03:33:36

0
temp[3]='F'; 

這行不correct.The「溫度」是常量的值,所以你不能修改它。

相關問題