gpt4 book ai didi

c - 如何在内存块中的任意位置插入值?

转载 作者:行者123 更新时间:2023-12-04 06:50:35 26 4
gpt4 key购买 nike

我有两个 C 函数,它们基本上对堆栈数据结构进行操作。这个推送类型为 OBJ 的值这实际上只是 unsigned long到栈顶。如有必要,堆栈也会增长。

OBJ Quotation_push_(CzState *cz, CzQuotation *self, OBJ object)
{
if ((self->size + 1) > self->cap) {
self->items = (OBJ *)CZ_REALLOC(self->items, sizeof(OBJ) * (self->cap + 1) * 2);
self->cap = (self->cap + 1) * 2;
}
self->items[self->size++] = object;
return (OBJ)self;
}

下一个函数插入 OBJ进入 self->items 中的任意位置大批。尽我所能,它只是无法正常工作。我用 Quotation_push_这里有一个虚拟值来获得自动增长行为。问题是我总是看到 CZ_NIL数组末尾的虚拟值,我试图插入的项目只是覆盖了该位置的内容。这是我到目前为止所得到的:
OBJ Quotation_insert_(CzState *cz, CzQuotation *self, OBJ object, int pos)
{
printf("have to move %d OBJ from %d to %d\n", self->size - pos, pos, pos + 1);
Quotation_push_(cz, self, CZ_NIL);
memmove(self->items + ((pos + 1) * sizeof(OBJ)), self->items + (pos * sizeof(OBJ)), sizeof(OBJ) * (self->size - pos));
self->items[pos] = object;
return (OBJ)self;
}

我没有收到任何段错误或错误,它只是没有按预期工作。有任何想法吗?

最佳答案

更新:

有两个问题,都在对 memmove 的调用中。 .

第一个是应该移动的字节数中的一个错误。正确的数字是:

sizeof(OBJ) * (self->size - pos - 1)

省略 -1 实际上会移动一个太多字节,将新的 CZ_NIL对象超过缓冲区的末尾。

第二个问题更大,但更微妙。向指针添加整数会导致编译器执行 pointer arithmetic ,它会自动考虑所指向对象的大小。见 this question详情。这是简短版本: self->itemsOBJ 的数组, 所以你不需要包含 sizeof(OBJ)memmove 的前两个参数中.

综上所述,正确的函数调用如下所示:
memmove((self->items + pos + 1),
(self->items + pos),
sizeof(OBJ) * (self->size - pos - 1));

关于c - 如何在内存块中的任意位置插入值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3173129/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com