我有一個簡單的程序:這兩個指針爲什麼相等?尋求澄清。
int main() {
char *c = "message";
char *z = "message";
if (c == z)
printf("Equal!\n");
else
printf("Not equal!\n");
return 0;
}
我想知道爲什麼這個打印Equal!
,即使在編譯的優化關閉(-O0
)。這表明c
和z
指向相同的存儲器區域,因此z
(例如,將z[0]
更改爲a
)的第一個突變將是昂貴的(需要複製和寫入)。
我發生了什麼事的理解是,我不聲明char
類型的數組,而是正在創建一個指向的第一個字符。因此,c
和z
都存儲在數據段中,而不是在堆棧上(並且因爲它們都指向相同的字符串文字,所以c == z
爲真)。
這是爲了寫入不同:
char c[] = "message";
char z[] = "message";
if (c == z) printf("Equal\n");
else printf("Not equal!\n");
它打印Not equal!
,因爲c
和z
都存儲在存儲器可變部分(即,疊層),並單獨存儲,使得一個突變一個不會影響另一個。
我的問題是,是我看到的行爲(如c == z
true
)定義的行爲?令人驚訝的是char *c
存儲在數據段中,儘管沒有被聲明爲const
。
行爲當我試圖改變char *z
定義?爲什麼,如果char *c = "message"
被放入數據段並且因此是隻讀的,那麼我得到bus error
而不是編譯器錯誤?例如,如果我這樣做:
char *c = "message";
c[0] = 'a';
我得到:
zsh: bus error ./a.out
雖然它編譯愉快。
任何進一步的澄清,以及爲什麼會感激。
你**不能**突變這些;這是未定義的行爲。 –
[char \ *和const char * *之間的區別]的可能的重複(http://stackoverflow.com/questions/9834067/difference-between-char-and-const-char) –
@OliCharlesworth對於那個接受的答案問題指出:「'char * name'你可以改變名稱指向的字符,也可以改變它指向的字符」,即'name'不是隻讀的。你在說,試圖寫入'name'將會是不確定的,這是不一致的(即我錯過了某些東西)。有什麼不同? – simont