Re: [問題] char *str="test"是const字串的問題

看板C_and_CPP作者 (guest)時間18年前 (2005/11/18 15:11), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串3/3 (看更多)
※ 引述《Aligu1009 (=.=)》之銘言: : : ... 略 : : 只是 str1指的東西,為什麼要放到唯讀區呢? : 改以int*為例 : 我們通常會用 : int i=5; : int *ptr = &i; : 這時我們仍可更改 *ptr : 因為 i 並非在唯讀區 : 但改成 char* 後 : 我會直觀的認為 (雖然這樣是錯的) : char *ptr = "test"; : "test"應該也要被放在非唯讀區 我覺得您的問題可能是誤解了 char str[] = "test" 這句 它的作法是先在某一塊記憶體 memory_a 中存放這五個字元 't', 'e', 's', 't', '\0' 然後再從 stack 找一塊空間 memory_b, 然後把 memory_a 開始的那五個字元拷貝過去 由於 memory_b 的型態是 char [] 不是 const char[] 因此可以更改 至於 char *str = "test" 也是一樣, 先在 memory_a 存放 "test" 這個字串常數 然後在 stack 找一塊空間給 str, 大小就僅是一個指標大小, 然後令它指向 memory_a 但是嚴格來說 "test" 是 const char[] 指標要指向它的話型態應該要是 const char* 而今天 char *str 可以指向它有某種特別的原因, 就如 cppOrz 大大文章中所說的那些 您以下面這個例子來類比並不合適, 因為光是敘述結構就跟首篇的 char str[] 不同 int i = 5; int *pi = &i; 如果以上面的結構來說的話, 類比的敘述是像下面這樣 char str[] = "test"; char *pstr = str; 當然可以想見, 可以透過 pstr 來修改 str. 就如同可以透過 pi 來修改 i. 常數值顧名思義本來就是不能修改,不管是放在哪裡 (前面文章說的 const data 區,或 overlapping objects 或者可能有其他地方) 至少編譯器得限制您的修改權,讓您無法去 修改 "test" 的值。當然今天編譯器允許您用 char * 指向它 (因為某些原因),就有可 能會使您寫出用 char * 指標來修改 "test" 值的程式碼,編譯會過,但是其行為是未定 義的。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.104.235.75
文章代碼(AID): #13VNwvVH (C_and_CPP)
文章代碼(AID): #13VNwvVH (C_and_CPP)