作者Ting1024 (無)
看板C_and_CPP
標題Re: [問題] 字串指標問題
時間Fri Dec 23 01:17:11 2011
※ 引述《sashoula (.....)》之銘言:
: int main(void) {
: char *s1 = "ABCDEFG";
: s1[0]='D';
: return 0;
: }
: → sashoula:所以如果以char s1[]來宣告時 會另外開一塊memory來存 12/22 18:45
: → sashoula:而用char *s1時 是直接指定字串的位址 而造成上述的問題? 12/22 18:46
雖然推文中好像有解答,但這只是知其然,不知其所以然。
"ABCDEFG" 這叫常數字串沒錯,但為什麼不能改他的內容?
幾點觀念分享:
1. C語言的標準定義,就是叫使用者不要去改他,會有
「不可預期的後果」。就是這樣而已
2. 基於1, 各編譯器廠商要想辦法在平台上實作出這樣
的標準。但編譯器動不到作業系統,有部分還是需要作業
系統幫忙才行。
3. 所以..上面的程式碼,有錯的地方在於他違反C語言的標準。
但這真的不能執行?可以
在DOS下上面的程式一定可以執行。在WINDOW下則不行。
因為WINDOW下面的編譯器會故意把"ABCDEF"填到code section,
而作業系統剛好會保護這塊區域,這樣就順便符合了C語言的規範。
(s1[0]='D' -> s1[0] 位於程式碼區塊,作業系統會發出例外)
但同樣的編譯器,在DOS環境下,他是無論如何都無法滿足C語言
的這個要求的。
s1[0]='D'; 毫無問題,不會當機,不會有例外。
但唯一的缺點是,他違反C語言標準,會失去可攜性。
總之,使用者可以直接參考教條,如果13-4說的,但為什麼是這樣?
為什麼這樣定?去瞭解他,你的LEVEL會往更高的層次提升。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.141.42.112
推 ashin0212:push 12/23 08:29
→ x000032001:我以為他會填到.data段耶..XD 12/23 12:37
推 syuasdio:推 12/24 11:11
→ Favonia:ELF 有 .rodata 然後 PE 有 .rdata 我也以為會擺在這 xDDD 12/24 23:05