看板 C_and_CPP 關於我們 聯絡資訊
這個問題是置底文第三誡:隨便 dereference 一個亂指的 pointer 至於這個題目是問「兩者執行的結果有何不同」,所以回文說明一下 兩者在 syntax 上的差異是 char **pp 擺的位置,code1 擺在全域,code2 擺在main 而我們知道 C 的未初始化全域變數是放在 BSS segment 中,而區域變數則放在 stack 中 BSS segment 在執行檔及目的檔中並沒有真實存在 (沒佔空間),是在程式執行時 由 loader 根據 header 中記載的 BSS segment 大小去規劃 runtime memory, 所以放在 BSS segment 裡的變數會被視為初值是 0; 而 stack 裡未初始化的變數,其值是 stack 裡的垃圾值。 所以 code1 執行的時候必定會收到 Segmentation Error, 因為他必定會 dereference 0x0 這個不合法的位置 而 code2 每次執行的時候 dereference 的位置不一樣, 運氣好一點 stack 裡的垃圾值指的恰巧是一個合法的記憶體位置,就可以執行成功 想要做實驗的話可以配合 debugger,如 gdb 或 VC++ Breakpoint 1, main (argc=1, argv=0xf29d38) at p2.c:7 7 *pp = p; (gdb) p pp $1 = (char **) 0xf29d38 (gdb) c Continuing. p = This is a string *pp = This is a string Program exited normally. 補充一下,如果想了解更多類似的知識 可以參考《程式設計師的自我修養》 http://goo.gl/f44R ※ 引述《Disjoint ( )》之銘言: : 問題(Question): : 最近要去面試,就上網亂找了一些題目來做,遇到瓶頸 : http://blogkrogh.blogspot.com/2008/07/c.html : 題目在上面網站的最後一題! : 問題1: : 題目問到兩段code執行結果有何不同?? : 我把兩段程式copy到DEV-C++測試半天 : 還真的不知道結果有什麼不同...>.< : 期望眾高手能為小弟指點迷津 : 問題2: : 關於程式問題的修正,我是加上malloc跟free之後就可以順利執行 : 但是說實在話我不懂為什麼,上網找資料跟書本好像都沒有類似的問題 : 有沒有大大能夠詳細的說明原因, : 還是其實我的修改方向錯誤???謝謝各位高手 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.122.198.41 ※ 編輯: Dannvix 來自: 140.122.198.41 (04/25 09:47)
singlovesong:全域是放在data section吧 malloc出來的才是放在heap 04/25 09:57
LPH66:heap 的值其實也不一定會是 0...記得像 gcc 就不會清 04/25 10:02
xatier:感謝精彩解說 04/25 10:20
ducksteven:丹丹必推 04/25 13:15
tomap41017:我也跟前兩樓有一樣的問題,應該是名詞解釋的差異吧!? 04/25 13:29
loveme00835:不是喔 :) 04/25 13:31
purpose:全域變數不是放 heap,他在目的檔、執行檔裡,就已經存在 04/25 13:44
purpose:這樣才能給其他目的檔做 extern char *p; 去連結 04/25 13:45
loveme00835:樓上指的是已初始化的部份 04/25 13:48
james732:全域變數怎麼會跑到heap去...? 04/25 13:50
purpose:未初始化是不是放 .bss ?忘了 04/25 13:52
Sorry... 早上還沒睡醒+學藝不精,不小心講錯了 :( ※ 編輯: Dannvix 來自: 125.227.82.195 (04/25 13:59)
loveme00835:未初始化留 symbol 04/25 13:53
purpose:嗯嗯 04/25 13:57
Disjoint:感謝大大詳解..^^ 04/25 15:55