作者sunneo (艾斯寇德)
看板C_and_CPP
標題Re: [問題] 關於struct的記憶體配置..
時間Mon May 4 23:37:44 2009
※ 引述《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
1F:→ sunneo:除非你的設計上允許word_name跟next共用位址 05/04 23:39
2F:推 rrosymoon:嗯..所以意思是說,使用struct的話,一定會多出一個沒有 05/04 23:41
3F:→ sunneo:而那位址是透過轉換過的(如xor) 才能這麼做 05/04 23:41
4F:→ rrosymoon:使用到的空間囉?(就是最後一筆struct中的next的空間) 05/04 23:41
5F:→ sunneo:有啊 你有使用到 你終究要用他存放下一筆資料的位址吧 05/04 23:42
6F:→ rrosymoon:已經是最後一筆了,所以next就沒有下一筆的位置可以指了 05/04 23:42
7F:→ sunneo:你不能假設那一定是最後一筆資料 05/04 23:43
8F:→ sunneo:如果是最後一筆 next通常是放NULL 05/04 23:43
9F:→ sunneo:因為任何結點(struct word)都有可能是目前的最後一筆 05/04 23:44
10F:→ sunneo:如果你希望next也能利用到 那就做成環狀list吧 05/04 23:45
11F:推 rrosymoon:嗯..那設成NULL的話,是不是就不會佔記憶體空間呢? 05/04 23:48
12F:→ rrosymoon:還是設成NULL只是用來判斷是不是到最後一筆? 05/04 23:48
13F:→ sunneo:只是用來判斷最後一筆 05/04 23:50
14F:推 rrosymoon:喔..所以最後一筆的next必需設成NULL,由此判斷是否到最 05/04 23:53
15F:→ rrosymoon:後.. 這樣就沒有浪費掉最後的那個next空間了.. 05/04 23:54
16F:→ rrosymoon:瞭解了~謝謝sunneo大大的解說~^___^ 05/04 23:55
17F:→ doggingg:指標看熟一點,用動態記憶體配置 05/07 15:13