[英]Why does char* cause undefined behaviour while char[] doesn't?
嘗試修改字符串文字會導致未定義的行為:
char * p = "wikipedia";
p[0] = 'W'; // undefined behaviour
一種防止這種情況的方法是將其定義為數組而不是指針:
char p[] = "wikipedia";
p[0] = 'W'; // ok
為什么char*
會導致未定義的行為,而char[]
不會?
任何修改C字符串文字的嘗試都具有未定義的行為 。 編譯器可能會安排將字符串文字存儲在只讀存儲器中(受操作系統保護,而不是由ROM保護,除非您使用的是嵌入式系統)。 但是語言不需要這個。 作為程序員,完全取決於您。
一個足夠聰明的編譯器可能會警告您,您應該將指針聲明為:
const char * p = "wikimedia";
盡管不帶const
的聲明在C語言中是合法的(為了不破壞舊代碼)。 但是無論有無編譯器警告, const
都是一個好主意。
(在C ++中,規則是不同的;與C字符串文字不同,C ++字符串文字實際上是const
。)
當您用文字初始化數組時,文字本身仍然存在於程序映像的潛在只讀區域中,但會被復制到本地數組中:
char s[] = "wikimedia"; /* initializes the array with the bytes from the string */
char t[] = { 'w', 'i', ... 'a', 0 }; /* same thing */
需要注意的是 不工作-陣列只能從一個支架初始化初始化,並且字符數組另外從一個字符串。 char u[] = *p
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.