我们如何使用一块连续的内存块,使其一部分与其余部分链接?例如,如果我使用 malloc 分配一个连续的字节块,现在我想以这样一种方式构造它,即块的初始部分将被构造为指向剩余部分的指针。这意味着指针和指向对象应该是连续的......??
2 回答
这个问题对我来说没有多大意义。假设您想要大小为 sizeBytes 的 nItems(意味着它们的大小都相同),您不需要存储指针,因为您可以在需要时计算分配内存的偏移量。所以你可能在你的问题中遗漏了一些标准。这是你如何做到的:
void *block = malloc(nItems * sizeBytes);
然后要进入n-th
对象,您只需执行以下操作:
void *myMemory = block + n * sizeBytes;
你可能想在那里做一些边界检查......
但这太容易了,所以我猜你确实有不同大小的结构,你想在一个 malloc 中分配并访问它们。因此,这不仅仅是弄清楚“子内存块”的地址是什么的问题,而是您想知道如何转换它,以便以后可以理解该对象(假设它是一个 C 结构) . 所以我想我不得不说我仍然对这个问题感到困惑。
您可能想要/需要每个内存“子块”应该具有的指针、大小和结构类型。然后,这将指示您的标题信息应该是什么样子。粗略地说,您需要计算“元数据”和“有效负载数据”所需的存储空间,然后将这些东西放在一起。
但这并不是一件容易实现的事情,因为您必须弄清楚如何告诉分配/初始化内存块的函数,对象的混合将是什么(以及每个子对象的布局顺序)。
恐怕这个问题被严重低估了。
如果你想要一个对象类型的二维数组,你可以这样做:
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 立方体中的记录。你可以把它带到你想要的任何维度,当然,如果你在大维度空间中处理大型对象,你迟早会炸毁你的记忆。