我期待這兩個下列載體在RAM相同的表示:C - 「char var []」和「char * var」之間的區別?
char a_var[] = "XXX\x00";
char *p_var = "XXX";
但怪,f(char argument[])
類型的庫函數crushs如果我把它用f(p_var)
運行的應用程序。但使用f(a_var)
是好的!
爲什麼?
我期待這兩個下列載體在RAM相同的表示:C - 「char var []」和「char * var」之間的區別?
char a_var[] = "XXX\x00";
char *p_var = "XXX";
但怪,f(char argument[])
類型的庫函數crushs如果我把它用f(p_var)
運行的應用程序。但使用f(a_var)
是好的!
爲什麼?
第一個創建一個包含字符串的char數組。數組的內容可以修改。第二個創建一個指向字符串文字的字符指針。字符串文字不能修改。
推測,功能f
修改傳遞給它的字符串的內容。
是的,它會修改。但爲什麼f(p_var)使crush和f(a_var)不是? – psihodelia 2009-12-10 12:14:32
因爲: char * p_var =「XXX」; 無法修改。 – 2009-12-10 12:16:04
數組可以作爲指針對待(通常),但這並不意味着它們總是可以互換的。正如另一個人所說,你的p_var指向一個文字,靜態的東西不能改變。它可以指向別的東西(例如,p_var = & a_var [0]),但不能更改由引號指定的原始值....
類似的問題是,當您將變量定義爲數組放入一個文件中,然後將其作爲指針外部使用。
問候
正如有人說,char *p_var = "XXX";
創建一個指向一個字符串文字是不能改變的,所以編譯器實現可以自由地重用文本,例如:
char *p_var = "XXX";
char *other = "XXX";
編譯器能選擇通過在存儲器中只存儲一次「XXX」來優化這一點,並使兩個指針指向它,修改它們的值可能會導致意外的行爲,所以這就是爲什麼你不應該嘗試修改它們的內容。
據我所知,在ANSI C中都可以修改 – psihodelia 2009-12-10 12:19:01
你知道錯了。該標準禁止修改字符串文字。 – 2009-12-10 12:20:53
好的,謝謝!現在,我會永遠記住它:) – psihodelia 2009-12-10 12:23:08