我有兩個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;
}
我沒有得到任何內存設計缺陷或錯誤,它只是不正常工作。有任何想法嗎?