我需要学校作业的帮助,特别是调整为没有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实现这个吗?
谢谢!
答案 0 :(得分:2)
如果您不允许使用realloc
,但允许使用malloc
和free
,则可以使用以下效率较低的序列替换该呼叫:
void *newData = malloc(newSize);
memcpy(newData, oldData, oldSize);
free(oldData);
在内部,realloc
做同样的事情,但它更有效率地做到了。与用户程序不同,realloc
知道动态内存块的实际大小,因此它检查是否newSize <= actualSize
以避免重新分配。当actualSize
不足时,realloc
会执行与上述相同的操作。 realloc
有额外的逻辑来处理大小需要缩小的情况,但在你的情况下,这不适用。