作者Dannvix (丹丹)
看板C_and_CPP
標題Re: [問題] 多重指標問題,請教板上高手
時間Mon Apr 25 09:38:47 2011
這個問題是置底文第三誡:隨便 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