C - 不使用 realloc 的动态大小的结构指针数组?
C - Dynamically sized array of struct pointers without using 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 的内存应该是这样的:
[图形元素 0][图形元素 1] ... [图形元素 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,不能使用 realloc。遗憾的是,我完成这项工作的唯一方法是使用 realloc。
任何人都可以指出正确的方向来仅使用 malloc 来实现它吗?
谢谢!
如果不允许使用 realloc
,但允许使用 malloc
和 free
,则可以将调用替换为以下效率较低的序列:
void *newData = malloc(newSize);
memcpy(newData, oldData, oldSize);
free(oldData);
在内部,realloc
做同样的事情,但效率更高。与用户程序不同,realloc
知道动态内存块的实际大小,因此它检查是否 newSize <= actualSize
以避免重新分配。当 actualSize
不足时, 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 的内存应该是这样的:
[图形元素 0][图形元素 1] ... [图形元素 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,不能使用 realloc。遗憾的是,我完成这项工作的唯一方法是使用 realloc。
任何人都可以指出正确的方向来仅使用 malloc 来实现它吗?
谢谢!
如果不允许使用 realloc
,但允许使用 malloc
和 free
,则可以将调用替换为以下效率较低的序列:
void *newData = malloc(newSize);
memcpy(newData, oldData, oldSize);
free(oldData);
在内部,realloc
做同样的事情,但效率更高。与用户程序不同,realloc
知道动态内存块的实际大小,因此它检查是否 newSize <= actualSize
以避免重新分配。当 actualSize
不足时, realloc
做同样的事情。 realloc
有额外的逻辑来处理需要缩小尺寸的情况,但在您的情况下这不适用。