Re: [問題] 多重指標問題,請教板上高手

看板C_and_CPP作者 (丹丹)時間13年前 (2011/04/25 09:38), 編輯推噓8(806)
留言14則, 9人參與, 最新討論串2/2 (看更多)
這個問題是置底文第三誡:隨便 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)

04/25 09:57, , 1F
全域是放在data section吧 malloc出來的才是放在heap
04/25 09:57, 1F

04/25 10:02, , 2F
heap 的值其實也不一定會是 0...記得像 gcc 就不會清
04/25 10:02, 2F

04/25 10:20, , 3F
感謝精彩解說
04/25 10:20, 3F

04/25 13:15, , 4F
丹丹必推
04/25 13:15, 4F

04/25 13:29, , 5F
我也跟前兩樓有一樣的問題,應該是名詞解釋的差異吧!?
04/25 13:29, 5F

04/25 13:31, , 6F
不是喔 :)
04/25 13:31, 6F

04/25 13:44, , 7F
全域變數不是放 heap,他在目的檔、執行檔裡,就已經存在
04/25 13:44, 7F

04/25 13:45, , 8F
這樣才能給其他目的檔做 extern char *p; 去連結
04/25 13:45, 8F

04/25 13:48, , 9F
樓上指的是已初始化的部份
04/25 13:48, 9F

04/25 13:50, , 10F
全域變數怎麼會跑到heap去...?
04/25 13:50, 10F

04/25 13:52, , 11F
未初始化是不是放 .bss ?忘了
04/25 13:52, 11F
Sorry... 早上還沒睡醒+學藝不精,不小心講錯了 :( ※ 編輯: Dannvix 來自: 125.227.82.195 (04/25 13:59)

04/25 13:53, , 12F
未初始化留 symbol
04/25 13:53, 12F

04/25 13:57, , 13F
嗯嗯
04/25 13:57, 13F

04/25 15:55, , 14F
感謝大大詳解..^^
04/25 15:55, 14F
文章代碼(AID): #1DjD2gMd (C_and_CPP)
文章代碼(AID): #1DjD2gMd (C_and_CPP)