Re: [問題] 多重指標問題,請教板上高手
這個問題是置底文第三誡:隨便 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
04/25 09:57, 1F
推
04/25 10:02, , 2F
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
04/25 13:44, 7F
→
04/25 13:45, , 8F
04/25 13:45, 8F
→
04/25 13:48, , 9F
04/25 13:48, 9F
→
04/25 13:50, , 10F
04/25 13:50, 10F
推
04/25 13:52, , 11F
04/25 13:52, 11F
Sorry... 早上還沒睡醒+學藝不精,不小心講錯了 :(
※ 編輯: Dannvix 來自: 125.227.82.195 (04/25 13:59)
→
04/25 13:53, , 12F
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
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):