内存分配和结构

时间:2013-02-14 06:21:09

标签: memory-management memory-address

我们如何使用连续的内存块,使其某些部分与其余部分链接?例如,如果我使用malloc分配一个连续的字节块,现在我想以这样的方式构造它,即块的初始部分将被构造为指向剩余部分的指针。这意味着指针和指向对象应该是连续的...... ??

2 个答案:

答案 0 :(得分:0)

这个问题对我来说没有多大意义。假设你想要大小sizeBytes的nItems(意思是它们都是相同的大小),你不需要存储指针,因为你可以在需要时计算分配内存的偏移量。所以你可能在你的问题中遗漏了一些标准。这是你如何做到的:

void *block = malloc(nItems * sizeBytes);

然后进入n-th对象,您只需执行以下操作:

void *myMemory = block + n * sizeBytes;

你想在那里做一些检查...

但这太容易了,所以我猜你真的有一些不同大小的结构,你想在一个malloc中分配并获得访问权限。因此,这不仅仅是一个确定“子内存块”的地址是什么的问题,而是你想知道如何投射它以便以后可以理解该对象(假设它是一个C结构) 。所以我想我不得不说我总是对这个问题感到困惑。

你可能想要/需要类似指针,大小和每个“子块”内存的结构类型。然后,这将指示您的标头信息应该是什么样子。粗略地说,您需要计算“元数据”所需的存储空间,然后计算“有效负载数据”,并将这些内容组合在一起。

但实现起来并不是一件微不足道的事情,因为你必须弄明白你如何告诉你的函数分配/初始化内存块的对象组合将是什么(以及每个子组件的布局顺序)对象)。

我担心这个问题很糟糕。

答案 1 :(得分:0)

如果你想要一种类型的对象的2D数组,你可以这样做:

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);

现在访问2D数组中的任何条目:

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立方体中的记录。你可以将它带到你想要的任何尺寸,当然,如果你在大尺寸空间中处理大型物体,你会比以后更快地炸掉你的记忆。