![]() |
||
|
Advance Member
![]() ![]() 加入日期: Mar 2003 您的住址: Land of living sky
文章: 334
|
弟想請教各位能人異士們...
如何使用 realloc() 來增加或減少 一個 linklist 所使用的記憶體空間 ? 1.重新劃分出來給linklist所使用的記憶體空間必須是完整連續的區段(方便之後追蹤搬移) 2.當我的linklist變小的時候,我需要跟著需求來減少記憶體使用量,這時候就必須一個個的搬移linklist裡的nodes到新的位址(所有pointers也得要跟著變動了) 目前我想到的笨方法就是根據新的記憶體空間位址來一個一個慢慢的橋每個pointer該指到的位址 ...請問實際上都是怎樣處裡的?拜託各位了 |
|||||||
|
|
|
New Member
加入日期: Jul 2004
文章: 5
|
使用 linklist 就是為了能夠隨時動態增減記憶體,"完整連續的區段"並不符合
他的使用目的。 建議使用陣列,這樣可以符合你的要求,而且搬移會比較簡單。 另有一種 vector(java的說法),一次配置一塊記憶體當陣列,快用完時再配 置另一塊陣列,每塊間用 linklist 串起來。這樣能夠動態增減,但是會有多 塊的連續空間。 |
||
|
|
|
Advance Member
![]() ![]() 加入日期: Mar 2003 您的住址: Land of living sky
文章: 334
|
嗯對喔..
如果每個 pointer 能夠自動指向到新位址,我就不需要它是完整連續的區段了 那請問如何寫一個能類似自動指向pointer的東西? 因為 API 的關係不能使用 陣列 ![]() |
|
|
|
New Member
加入日期: Jul 2004
文章: 5
|
不能用陣列? 沒有看過這樣的程式語言呢?
一般來說.. BYTE* array=(char*)alloc(n); 就可以直接用 array[0],array[1]..了,不用特地宣告為陣列,不過要自己小 心不要超過 n-1 你最原始的問題: 如何使用 realloc() 來增加或減少 一個 linklist 所使用的記憶體空間 答案是: 如果是純的 linklist, 不行, linklist 已經使用了剛剛好的空間,你無法變 大或變小, 除非增減裡面的元素。 如果是陣列或是前面所說的 Vector, 就可以改變預留的空間。 |
|
|
|
Advance Member
![]() ![]() 加入日期: Mar 2003 您的住址: Land of living sky
文章: 334
|
jaw001 大
其實是我表達能力不好,這個程式主要是著重在記憶體管理上 linklist 一開始 已經用 malloc() 找了一塊記憶體 題目主要的要求就是 -當 linklist 裡的元素全部都使用到的話 用 realloc() 來加大記憶體空間成兩倍,延長 linklist,再把新的空間分配給linklist新增加的部份 -當 linklist 裡只有一半的元素使用到的話 找一塊只有一半空間的記憶體,然後把全部有使用到的元素移到裡面 (移過去後原 linklist 的結構還是不變,例 a元素->next == b元素, b元素->prev == a元素 ) 也不是不能使用陣列,而是一樣也不能避開上面兩個要求 還是感謝啦 ![]() |
|
|
|
New Member
加入日期: Jul 2004
文章: 5
|
嗯,我還是不大了解你的目的。
linklist 在 insert 時才會配置一個 node 的記憶體,刪除一個 node 時就會 釋放一個 node 的記憶體了。他是動態的配置記憶體,並不是一開始就 alloc. 所以當使用 5 個 node 的 linklist 並不會佔到 10 node 的記憶體,所以不需 要特別去 realloc. 你的講法應該是比較偏向 Vector, 他會 alloc 一塊陣列,不夠時再去 alloc 另一塊陣列,來後用 linklist 串起來. 如果最後一塊陣列你填不滿,想換一個 比較省記憶體的小區塊來放,就另外 alloc 小陣列,把內容 copy 去,再 free 原來的最後一塊。 你偏愛的解決方案應該是 clone 吧, currentNode=getHeadNodeA(); for (length of linklist A) { target=currentNode.getTarget(); insertToB(target); currentNode=currentNode.getNext(); } delete A; 然後 B 就是新的了,不需要去改地址。 |
|
|