簡體   English   中英

為什么char *會導致未定義的行為,而char []不會呢?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM