Re: [問題] 關於struct的記憶體配置..

看板C_and_CPP作者 (艾斯寇德)時間15年前 (2009/05/04 23:37), 編輯推噓3(3014)
留言17則, 3人參與, 最新討論串2/2 (看更多)
※ 引述《rrosymoon (紫月)》之銘言: : 請問一下喔~我看書上是說,struct跟陣列很像,但它可以 : 將多種不同型態的資料,集合在一起。 : 那,若是使用動態配置記憶體的方式,程式是一次幫它裡面 : 所有的資料型態都給予記憶體嗎?還是可以只給指定的某一 : 個資料型態記憶體呢? : 比如: :  struct word{ : char *word_name; : struct word *next; : }; : ... : wp=(struct word *)malloc(sizeof(struct word)); : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ : 這個部份,程式會幫wp->word_name跟wp->next都分別 : 配置記憶體?所以一次會增加二筆資料的記憶體? :  還是說只有使用到的會給記憶體呢? :  那有辦法只單獨配置wp->word_name的記憶體空間嗎? 你要把函式的責任釐清 malloc就是malloc 上述動作只是說「我有一個指標叫做wp,指向一塊sizeof(struct word) 的空間」 所以裡面的word_name跟next指標都有該有的空間。 有空間才能存放資料,因此你是一定要給next指標一個空間的。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.227.127.8

05/04 23:39, , 1F
除非你的設計上允許word_name跟next共用位址
05/04 23:39, 1F

05/04 23:41, , 2F
嗯..所以意思是說,使用struct的話,一定會多出一個沒有
05/04 23:41, 2F

05/04 23:41, , 3F
而那位址是透過轉換過的(如xor) 才能這麼做
05/04 23:41, 3F

05/04 23:41, , 4F
使用到的空間囉?(就是最後一筆struct中的next的空間)
05/04 23:41, 4F

05/04 23:42, , 5F
有啊 你有使用到 你終究要用他存放下一筆資料的位址吧
05/04 23:42, 5F

05/04 23:42, , 6F
已經是最後一筆了,所以next就沒有下一筆的位置可以指了
05/04 23:42, 6F

05/04 23:43, , 7F
你不能假設那一定是最後一筆資料
05/04 23:43, 7F

05/04 23:43, , 8F
如果是最後一筆 next通常是放NULL
05/04 23:43, 8F

05/04 23:44, , 9F
因為任何結點(struct word)都有可能是目前的最後一筆
05/04 23:44, 9F

05/04 23:45, , 10F
如果你希望next也能利用到 那就做成環狀list吧
05/04 23:45, 10F

05/04 23:48, , 11F
嗯..那設成NULL的話,是不是就不會佔記憶體空間呢?
05/04 23:48, 11F

05/04 23:48, , 12F
還是設成NULL只是用來判斷是不是到最後一筆?
05/04 23:48, 12F

05/04 23:50, , 13F
只是用來判斷最後一筆
05/04 23:50, 13F

05/04 23:53, , 14F
喔..所以最後一筆的next必需設成NULL,由此判斷是否到最
05/04 23:53, 14F

05/04 23:54, , 15F
後.. 這樣就沒有浪費掉最後的那個next空間了..
05/04 23:54, 15F

05/04 23:55, , 16F
瞭解了~謝謝sunneo大大的解說~^___^
05/04 23:55, 16F

05/07 15:13, , 17F
指標看熟一點,用動態記憶體配置
05/07 15:13, 17F
文章代碼(AID): #19_mlIGC (C_and_CPP)
文章代碼(AID): #19_mlIGC (C_and_CPP)