【问题标题】:C - Dynamically sized array of struct pointers without using realloc?C - 不使用 realloc 的动态大小的结构指针数组?
【发布时间】:2016-09-24 09:59:41
【问题描述】:

我在学校作业方面需要帮助,特别是调整分配给没有重新分配的指针的内存量。

我的程序中有以下声明。

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 来实现这一点的正确方向?

谢谢!

【问题讨论】:

  • 不要投射malloc()/realloc()

标签: c arrays pointers malloc realloc


【解决方案1】:

如果不允许使用realloc,但允许使用mallocfree,则可以将调用替换为以下效率较低的序列:

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

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

【讨论】:

  • 技术上 realloc 确实是 memcpy(newData, oldData, min(oldSize, newSize)) 但在这种情况下这并没有什么区别,因为大小一直在增长。
  • @melpomene 对,realloc 需要比这更聪明。不过,这对于 OP 来说应该足够了,因为对于他的程序内存分配是单向的。
  • @melpomene 如果你想要技术,那么真正的realloc 实现还需要在分配失败时返回原始指针,如果原始指针是空指针,则避免memcpy 步骤.
  • @jamesdlin 绝对。但是,由于 OP 不打算实现 realloc,因此我只给了他完成任务所需的详细信息。
猜你喜欢
  • 2017-07-02
  • 2018-03-25
  • 1970-01-01
  • 2011-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-19
  • 1970-01-01
相关资源
最近更新 更多