2011-09-20 69 views
4

下面是一個非常簡單的例子。它在Mac OS X(Snow Leopard)上使用gcc編譯得很好。在運行時輸出總線錯誤:10.這裏發生了什麼?爲什麼我不能編輯char *中的字符?

char* a = "abc"; 
a[0] = 'c'; 
+0

這是一個字符串文字,您不能修改它,因爲您的指針指向代碼的文本部分中的位置,該位置是隻讀的。使用'char a [] =「abc」'作爲創建一個填充字符串的字符數組的短手。 – steabert

回答

5

您的代碼將a設置爲指向​​的指針,該指針是無法修改的文字數據。當您的代碼違反此限制並嘗試修改該值時,會發生總線錯誤。

試試這個:

char a[] = "abc"; 
a[0] = 'c'; 

,創建一個字符數組(在你的程序的正常數據空間),副本字符串文字到您的數組的內容。 現在你應該不會對修改它有任何麻煩。

+0

那麼你如何聲明一個「可變長度字符串」數組? – Pacerier

3

您試圖修改字符串常量。改爲:

char a[] = "abc"; 
a[0] = 'c'; 
+0

所以使用char *相當於聲明const char *,編譯器不會警告你?相反,你會得到一個愉快的運行時錯如果是這樣,我看到添加const關鍵字的用處。 – Nate

+1

它會警告你,如果你使用-Wwrite-strings進行編譯,不幸的是沒有被啓用-Wall –

1

char * a =「abc」;是一個存儲在ELF二進制文件的.data節中的常量字符串。您不允許修改此內存,並且如果您在某些情況下會產生未定義的行爲,它將不會發生錯誤,但不會在您的情況下修改內存,從而導致總線錯誤,因爲您嘗試訪問通常無法訪問的內存(用於寫作目的)

+0

其實,''abc「'是常量字符串,'char * a'是一個(非''constst ')指針與該常量中第一個字符的地址。 – sbi

+0

@sbi是啊,這就是我的意思,應該有不同的措辭 –

3

char* a = "abc"; 

依賴於從const char[]char*危險隱式轉換(文字類型的字符串的)。 (在C++中,這種轉換已經被棄用了十多年,但我不知道C)

字符串文字不能被改變。

1

char * str =「string」;在這種情況下,它被視爲只讀文字。它類似於寫'const char * str =「string」'。也就是說,指針'str'指向的值是一個常量。嘗試編輯會導致BUS ERROR。

相關問題