C - 动态调整大小的struct指针数组而不使用realloc?

时间:2016-09-24 09:59:41

标签: c arrays pointers malloc realloc

我需要学校作业的帮助,特别是调整为没有realloc的指针分配的内存量。

我的程序中有以下声明。

struct GraphicElement
{
    enum{ SIZE = 256 };
    unsigned int numLines;
    Line* pLines;
    char name[SIZE];
};

typedef struct 
{
    unsigned int numGraphicElements;
    GraphicElement* pElements;
}VectorGraphic;

VectorGraphic Image;

随着程序运行,我将向pElements添加更多GraphicElements。

例如,在5次迭代之后,pElements的内存应该是这样的:

[GraphicElement 0] [GraphicElement 1] ... [GraphicElement 4]

对于函数AddGraphicElement(VectorGraphic * vg),我有这段代码(删除了一些行以便于阅读):

vg->pElements = (GraphicElement*)realloc(vg->pElements, sizeof(GraphicElement)*(vg->numGraphicElements+1));

//Then I assign inputs from user into the members of the struct at vg->pElements[vg->numGraphicElements]

vg->numGraphicElements++;

这是有效的,但是根据我教授的指示,我只允许使用malloc和free- no realloc。可悲的是,我做这项工作的唯一方法是使用realloc。

有人能指出我正确的方向,只使用malloc实现这个吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

如果您不允许使用realloc,但允许使用mallocfree,则可以使用以下效率较低的序列替换该呼叫:

void *newData = malloc(newSize);
memcpy(newData, oldData, oldSize);
free(oldData);

在内部,realloc做同样的事情,但它更有效率地做到了。与用户程序不同,realloc知道动态内存块的实际大小,因此它检查是否newSize <= actualSize以避免重新分配。当actualSize不足时,realloc会执行与上述相同的操作。 realloc有额外的逻辑来处理大小需要缩小的情况,但在你的情况下,这不适用。