Re: [問題] char *str="test"是const字串的問題
※ 引述《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
討論串 (同標題文章)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章