看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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