0

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

4

2 回答 2

0

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

void *block = malloc(nItems * sizeBytes);

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

void *myMemory = block + n * sizeBytes;

你可能想在那里做一些边界检查......

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

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

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

恐怕这个问题被严重低估了。

于 2013-02-14T06:47:52.690 回答
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 立方体中的记录。你可以把它带到你想要的任何维度,当然,如果你在大维度空间中处理大型对象,你迟早会炸毁你的记忆。

于 2013-02-14T07:39:03.470 回答