2012-04-13 58 views
1

我正在一個項目,我需要malloc一些數據。我試圖通過改變我使用的主要結構值來減少我的程序的堆峯。我正在使用鏈接列表。我的結構是這樣的:malloc全球陣列

struct myS{ 

int a,b; 
float a,b; 
struct myS *next; 

}; 

我在想,而不是mallocing的結構指針我將其存儲在一個全局數組,因爲我沒有太多的數據。我將如何做到這一點?

+0

如果你真的沒有太多的數據,不要這樣做。這聽起來像是過早的優化。如果你有很多數據,不要這樣做,但首先閱讀'malloc'的替代品和類似的東西。 – 2012-04-14 06:59:06

回答

0

你可以做這樣的事情:

struct myS myArray[ARRAY_SIZE]; 

/* ... */ 

struct myS *head = &myArray[0]; 

head->next = &myArray[1]; 
head->next->next = &myArray[2]; 

/* etc... */ 

使用沒有數組的索引是連續的,例如head可以指數3head->next可以索引21

如果要初始化列表中同時使用的陣列中的所有項目,你可以在一個循環做到這一點:

struct myS *node = head; 
for (int i = 1; i < ARRAY_SIZE; i++) 
{ 
    node->next = &myArray[i]; 
    node = &myArray[i]; 
} 
node->next = NULL; /* Make sure the tail of the list doesn't have a 'next' pointer */ 
1

如果你有你可以用創建一個全局數組 [不動態分配],讓它爲struct myS heap[],並且整數idx,初始化爲0。分配元素後,您需要增加idx,並將此元素附加到請求者。

注 - 它只是如果你不希望刪除的元素很好地解決 [或者你能負擔得起分配每個元素只有一次
如果您確實需要刪除,您需要分配一個額外的數組,告訴您當前正在使用哪些元素,使idx循環[與idx = (idx + 1) % size一起增加],並在給出之前檢查每個元素是否已分配,但正如我所說 - 它可能會更耗時!

代碼卡[不支持刪除]:

struct myS heap[SIZE]; 
int idx = 0; 

... 

struct myS* allocate() { 
    return &(heap[idx++]); 
} 

注:上面的代碼卡是危險的 - 如果你嘗試分配更多的元素,那麼你必須在SIZE它可能溢出。

+1

如果您維護陣列中的空閒節點列表,最初由整個陣列組成,則無需執行遍歷即可找到未分配的節點。 – 2012-04-14 00:03:50

+0

@KeithThompson:謝謝,那確實可以是一個很好的優化!但我相信OP實際上是在分配每個元素的簡單版本之後,我將編輯並嘗試添加您描述的解決方案,如果他會指出這確實是他之後的事情。 – amit 2012-04-14 00:05:57