Memory management 内存分配和结构

Memory management 内存分配和结构,memory-management,memory-address,Memory Management,Memory Address,我们如何使用一个连续的内存块,使它的一部分与其余部分链接?例如,如果我使用malloc分配一个连续的字节块,现在我想以这样一种方式构造它,即块的初始部分将被构造为指向剩余部分的指针。这意味着指针和指针对象应该是连续的…?这个问题对我来说没有多大意义。假设您想要大小为sizeBytes的NITEM(意味着它们都是相同的大小),您不需要存储指针,因为您可以在需要时计算分配内存的偏移量。所以你可能在你的问题中遗漏了一些标准。以下是您如何做到这一点: void *block = malloc(nItem

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

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

void *block = malloc(nItems * sizeBytes);
然后,要进入第n个
对象,只需执行以下操作:

void *myMemory = block + n * sizeBytes;
你可能想在那里做一些边界检查

但这太容易了,所以我猜你真的有不同大小的结构,你想在一个malloc中分配并访问它们。因此,这不仅仅是一个弄清楚“内存子块”的地址是什么的问题,而是您想知道如何转换它,以便以后能够理解对象(假设它是C结构)。因此,我想我不得不说,我仍然对这个问题感到困惑

您可能需要指针、大小以及内存中每个“子块”应该具有的结构类型。这将指示您的标题信息可能应该是什么样子。大致上,您需要计算“元数据”和“有效负载数据”所需的存储,然后将这些数据合并到一起

但这不是一件容易实现的事情,因为您必须弄清楚如何告诉分配/初始化内存块的函数对象的组合(以及每个子对象的布局顺序)


很遗憾,这个问题没有明确说明。

如果您想要一种类型的对象的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);
现在,要访问二维阵列中的任何条目:

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多维数据集中的记录。你可以把它带到任何你想要的维度,当然,如果你在大维度空间中处理大对象,你会很快耗尽你的内存。

好的,是的,我的问题严重不足。!!这是另一个类比…如果我使用malloc()分配一个典型的2D数组,我在一些块中得到非连续的块,在另一些块中有指向数据的指针,还有数据…我想分配所有的块(所有的都是指指针和数据)在内存中是连续的..我怎么做???如果你想要一种类型的对象的2D数组,您可以这样做: