|
发表于 2014-5-15 13:08:58
|
显示全部楼层
回帖奖励 +2 鱼币
本帖最后由 kikiatw 于 2014-5-15 13:29 编辑
tree p1, *p2
p1是在"棧" 區宣告一個tree的空間,
然後你 InitTree1(tree &p1) 把 p1的位址傳給p 之後, 又把這個p指向在 "自由存儲" 區給定一個 struct _tree的空間, 然後對自由存儲區的這個空間給歸零, 但是原本的棧區根本沒動到.
把下面這一行mark掉就可以了
// p = (tree*) malloc(sizeof(tree));
p2就更詭異了, 我在台灣我們幾乎很少人這麼虐自己的, 很少直接用 *p2 = &p 這種用法
要傳值嘛就用同一種變數, *p1, *p2 然後 p1 = p2. 要取值的話才用 * 把值取出來
但是你們都要把一個簡單的一維數組搞成好幾維, 這樣對你們的思考是靈活了, 但是感覺好像也綁手綁腳的
介紹你一個好用的函數, 就可以直接幫你initial了..
memset(p2, 0, sizeof(struct _tree))
另外個人小小意見, 指針之所以稱為指針, 是要你拿這個指針指向一個實體位置的, 就像鏈表他也是指向記憶體中定義好的頭, 尾的位置. 當你定義一個 tree *p2 的時候, 他的意義只是說我定義一個p2 指向 tree 類型的指針, 你對這個指針initial 並沒有太大的意義, 如果把他指向p1, 然後用指針對p1 做 initial 的話, 就有意義. 如果你的malloc 放在main, 然後用p2將你malloc出來的位址傳到含數裡面去初始化, 那就有意義, 但是你只是定義一個指針, 然後用函數幫他生成一個空間, 那指針就沒太大意義了, 說得很繞口, 希望你看得懂啦, 我是以寫一個大型程式來看待這個問題, 指針只是拿來傳遞位址用, 不用太虐待自己..
|
|