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

看板C_and_CPP (C/C++)作者 (cppOrz)時間19年前 (2005/11/18 01:41), 編輯推噓2(201)
留言3則, 2人參與, 最新討論串2/3 (看更多)
※ 引述《firose (guest)》之銘言: : ※ 引述《Aligu1009 (=.=)》之銘言: : : 謝謝你的回覆 :) : : 可是我還是不懂 : : C幹麼要這樣子做呢? : : 直接用個關鍵字const來限制 : : 閱讀上會更清楚啊? : char *str="test"; //指標 : char str[] = "test"; //陣列 : 首先 "test" 是 const char[] 的一個常數值, 會被放到唯讀區域 這可能請對標準比較熟的人解釋一下,常數或字串常數,在 C/C++ 中 的實作是編譯器自行決定的。一般為了效率考量,通常是放在 const data 區段;某些編譯器可能將它放在 overlapping objects 裏,做 為一種選擇性的優化機制。企圖修改它們,會導致未定義的後果;所 以雖然允許你拿個 char * 指著,但改了就爆。 會 ASM 的人當然可以研究一下自己手上的 C/C++ 編譯器究竟是怎麼 處理某些細節的。不過很多問題,真的是「先弄清楚定義」,自己有 個底,可以節省很多盲目摸索的時間。 : 至於 C 為什麼讓 char *str 可以指向 "test", 可能有某種原因, 但就是不能改值 : 不過第二行就不一樣, 會在 stack 分配空間給 str 陣列並把 "test" 的值拷貝過去 : 所以你改的話是改 str 這個陣列的記憶體, 不是 "test" 的記憶體位置 為什麼 C 讓 char * 可以指向字串常數?這是由於 C 著重效率多過 嚴謹。找一本比較新的 C/C++ 課本,通常會告訴你,正確的寫法是: char const *s = "test"; 如果希望能改動,就自己指定一塊記憶體(避免編譯器的優化實現, 把它放到 const data 區域),例如: char s[] = "test"; // 放在 stack 區域(這其實是下面的簡寫) 或 char s[] = { 't', 'e', 's', 't', '\0' }; // 原本的寫法 或 static char s[] = "test"; // 放在 global/static 區域 至於可以通融 non-const char * 版本的寫法,那是因為已經有成萬 上億行的舊程式碼這樣做了,標準不得不向現實妥協;但當然三令五 申告訴大家舊的寫法是不好的(depreciated),請不要再用。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.120.214.120

11/18 08:43, , 1F
11/18 08:43, 1F

11/18 13:08, , 2F
嗯 好像有比較清楚了 不過放的位置會對效率有這麼大的
11/18 13:08, 2F

11/18 13:09, , 3F
影響 大到甚至需要創造這種令人混淆的語法嗎?
11/18 13:09, 3F
文章代碼(AID): #13VC3JLc (C_and_CPP)
文章代碼(AID): #13VC3JLc (C_and_CPP)