2013-02-25 30 views
0

我有一個大型的char數組,它用作內存池,並且希望將指針存儲在數組的第一個位置,該指針指向池中的下一個打開位置是,所以每次將某個東西分配給池時,指針都會指向剛剛分配的那個字節。我唯一的問題是我不太清楚如何將指針存儲在數組中,然後能夠在其他函數中對其進行修改,因爲指針將存在的唯一位置在數組[0]位置。任何人都可以在正確的方向指向我嗎?在C++中存儲和檢索數組中的指針

的字符數組聲明如下:

char pool[size]; 
+0

爲什麼你(a)實現一個內存池和(b)實現一個內存池作爲char數組? – Johnsyweb 2013-02-25 05:22:21

+0

這是一個項目,它只是一個基本的實現,它提供了我需要使用的少量代碼,它使用一個字符數組 – zfetters 2013-02-25 05:24:35

回答

0

如果你不能按照其他答案的建議,因爲你絕對必須使用池來存儲所有信息在它,以存儲該炭陣列中的整數信息最安全的方法是使用memcpy(我使用C++ 11語法):

#include <cstring> 
#include <iostream> 

int main() 
{ 
    using size_type = std::size_t; 
    static constexpr size_type size = 1000; 
    char pool[size]; 

    /* Store 12 as integer information at the beginning 
    of the pool: */  
    size_type next_free = 12; 
    std::memcpy(pool,&next_free,sizeof(size_type)); 

    /* Retrieve it: */ 
    size_type retrieved = 0; 
    std::memcpy(&retrieved,pool,sizeof(size_type)); 

    /* This will output 12: */  
    std::cout << retrieved << std::endl; 

    return 0; 
} 

當然,這意味着該池的第一個sizeof(size_type)條目不得用於存儲任何實際字符。您實際可以使用的最低的條目是pool[sizeof(size_type)]

1

你真正想要的是一個索引到該數組,告訴你在哪裏插入。

你可以聲明結構:

struct pool 
{ 
    char poolData[size]; 
    int insertIndex; 
}; 

所以,你總是有要插入到一起的池內存和索引。或者,只需要一個單獨的變量並將它們傳遞給需要使用它的人。

char pool[size]; 
int insertIndex; 

沒有必要「劫持」數組的第一個元素,並用它不同於陣列的其餘部分;只需聲明另一個變量來跟蹤池的狀態。

+0

這是一個初步想法進入該項目,但它需要所有變量我聲明我自己的使用必須存儲在內存池中,這就是爲什麼我的下一個想法是將指針保留在第一個數組位置並指向池中的下一個空閒字節 – zfetters 2013-02-25 05:28:37

0

我認爲你需要的是一個索引來記住池中下一個空的位置(最初將爲零)。

char pool[size]; 
int index = 0; 

然後每次插入新的元素,你只是增加它:

if(index < size) { 
    pool[index] = 123; 
    index++; 
} 
0
char **pPoolEnd = (char **) pool; 

初始化你想要的指針。

*pPoolEnd = pool + sizeof(char **); 

使其指向自己的末端(例如,當池中沒有別的東西時)。

但是,您爲什麼要這麼做?這很混亂,容易出錯,可能不必要。其他人指出更好的選擇。假設我有一個這樣的游泳池,我可能會選擇其中一個,或者簡單地使用一個單獨的指針char *poolEnd以及pool。另外,向用戶公開您的實現細節(「池結束指針在pool [0]」),更糟糕的是希望他們處理它們(「無論何時您請更新pool [0] d喜歡從泳池中分配「)。認爲mallocfree;向用戶展示簡單的功能界面。