下面是一個非常簡單的例子。它在Mac OS X(Snow Leopard)上使用gcc編譯得很好。在運行時輸出總線錯誤:10.這裏發生了什麼?爲什麼我不能編輯char *中的字符?
char* a = "abc";
a[0] = 'c';
下面是一個非常簡單的例子。它在Mac OS X(Snow Leopard)上使用gcc編譯得很好。在運行時輸出總線錯誤:10.這裏發生了什麼?爲什麼我不能編輯char *中的字符?
char* a = "abc";
a[0] = 'c';
您的代碼將a
設置爲指向的指針,該指針是無法修改的文字數據。當您的代碼違反此限制並嘗試修改該值時,會發生總線錯誤。
試試這個:
char a[] = "abc";
a[0] = 'c';
,創建一個字符數組(在你的程序的正常數據空間),副本字符串文字到您的數組的內容。 現在你應該不會對修改它有任何麻煩。
那麼你如何聲明一個「可變長度字符串」數組? – Pacerier
您試圖修改字符串常量。改爲:
char a[] = "abc";
a[0] = 'c';
所以使用char *相當於聲明const char *,編譯器不會警告你?相反,你會得到一個愉快的運行時錯如果是這樣,我看到添加const關鍵字的用處。 – Nate
它會警告你,如果你使用-Wwrite-strings進行編譯,不幸的是沒有被啓用-Wall –
char * a =「abc」;是一個存儲在ELF二進制文件的.data節中的常量字符串。您不允許修改此內存,並且如果您在某些情況下會產生未定義的行爲,它將不會發生錯誤,但不會在您的情況下修改內存,從而導致總線錯誤,因爲您嘗試訪問通常無法訪問的內存(用於寫作目的)
其實,''abc「'是常量字符串,'char * a'是一個(非''constst ')指針與該常量中第一個字符的地址。 – sbi
@sbi是啊,這就是我的意思,應該有不同的措辭 –
這
char* a = "abc";
依賴於從const char[]
到char*
危險隱式轉換(文字類型的字符串的)。 (在C++中,這種轉換已經被棄用了十多年,但我不知道C)
字符串文字不能被改變。
char * str =「string」;在這種情況下,它被視爲只讀文字。它類似於寫'const char * str =「string」'。也就是說,指針'str'指向的值是一個常量。嘗試編輯會導致BUS ERROR。
這是一個字符串文字,您不能修改它,因爲您的指針指向代碼的文本部分中的位置,該位置是隻讀的。使用'char a [] =「abc」'作爲創建一個填充字符串的字符數組的短手。 – steabert