2013-02-14 159 views
0

我們如何使用連續的內存塊來使其中的一部分與其餘部分相連?例如,如果我使用malloc分配一個連續的字節塊,現在我想以這樣一種方式來構造它,即塊的初始部分將被構造爲指向剩餘部分的指針。這意味着指針和指向對象應該是連續的......?內存分配和結構

回答

0

這個問題對我來說沒有多大意義。假設您想要大小爲sizeBytes的nItem(意味着它們的大小都相同),您不需要存儲指針,因爲您可以在需要時計算分配內存的偏移量。所以你可能在你的問題中缺少一些標準。這裏是你如何做到這一點:

void *block = malloc(nItems * sizeBytes); 

然後伸入n-th對象,你會簡單地做:

void *myMemory = block + n * sizeBytes; 

你會想可能做一些邊界檢查有..

但是這太容易了,所以我猜你確實有不同大小的結構,你想在一個malloc中分配並訪問。因此,這不僅僅是一個確定「子塊內存」地址的問題,而是你想知道如何進行投射,以便稍後能夠理解該對象(假設它是一個C結構) 。所以我想我必須說我總體上對這個問題感到困惑。

您可能需要/需要像指針,大小和內存中每個「子塊」應該是的結構類型之類的東西。這會顯示你的標題信息應該是什麼樣子。粗略地說,你需要計算'元數據'和'有效載荷數據'所需的存儲空間,然後將這些東西放在一起。

但實現起來並不是一件容易的事,因爲你必須弄清楚如何告訴你的函數如何分配/初始化內存塊什麼是對象混合(以及每個子對象的佈局順序-目的)。

恐怕這個問題是嚴重低估的。

+0

好的,是的,我的問題是嚴重低於指定。這裏是另一個比喻...如果我使用malloc()分配一個典型的二維數組,我在某些塊中獲得非連續塊有指向其他數據的指針有數據...我想分配所有這些數據他們我的意思是指針和數據)連續在內存..如何做到這一點? – CoolToshi45 2013-02-14 07:01:44

+0

如果你想要一種類型的對象的二維數組,你可以這樣做: – 2013-02-14 07:34:11

0

如果你想要一個類型的對象的二維數組,你可以做這樣的:

int entries = xSize * ySize;   // create a 2D array of xSize by ySize dimensions 
size_t buffSize = entries * objectSize; // objectSize is number of bytes for your object 
void *block = malloc(buffSize); 

我們訪問您的二維數組中的任何條目:

void *thingie = block + y * xSize + x; 

現在的thingie點阻止它對應於x,y。如果你想,你也可以改變你的內存對象的佈局。上面我做了專業。你可以這樣做:

void *thing = block + x * ySize + y; 

這將是專欄。以上可以擴展到n維:

int entries = xSize * ySize * zSize; // create a 3D array of xSize, ySize, zSize dimensions 
size_t buffSize = entries * objectSize; // objectSize is number of bytes for your object 
void *block = malloc(buffSize); 

然後:

void *thingie = block + z * ySize * xSize + y * xSize + x; 

到你的3D立方體紀錄。你可以把它放到你想要的任何維度上,當然,如果你在大尺寸空間中處理大型物體,你會比以後更早炸燬你的記憶。