我正在寻找一种在运行时为现有结构(最初已经分配了内存)分配额外内存(在C中)的方法。我有一种感觉,我可以使用memmove或类似的东西,但它仍然只是一个复制操作,并不会增加运行时结构可用的内存量。此外,我不想每次需要时都复制整个结构,这在程序期间会有数百次(结构已经很大)。有人可以帮忙吗?
更新:感谢大家的回复。为了提供更多细节,我要做的是运行一个MPI并行化代码,该代码最初创建了许多结构实例(称之为'S')。结构的每个实例都包含一个数组'T',它记录了代码运行时发生的特定事件的时间。这些事件在运行时发生,并且每个S实例的事件数量不同。例如,S [0]可能会看到100个事件(因此需要一个长度为100个元素的数组),但S [1]可能只看到1个事件(以及S [2] 30事件等)因此,为S的每个实例(有数百万个)在开始时分配大量内存将是非常浪费的,因为有些可能会填充数组但其他人不会甚至接近。事实上,我已经尝试了这一点,对于我正在运行它的机器来说太过分了。
我会在这里尝试一些想法并发布我的进展。非常感谢!
答案 0 :(得分:5)
您可以使用realloc()
。
答案 1 :(得分:3)
没有办法做你所描述的,因为没有办法保证你的结构当前占用的那个旁边有可用的内存。
要做的标准事情是分配更多内存并复制数据。 当然,如果你能知道(估计)你需要的内存分配大小,你可以预先分配它并避免复制。
但请注意,C语句中的结构一旦声明就具有固定大小,因此您似乎并不需要为现有结构分配更多内存...
答案 2 :(得分:0)
realloc
是扩展现有动态内存的唯一方法。 realloc
将尝试扩展现有缓冲区,如果它在扩展中失败,它将为所需的总大小分配新缓冲区,并将从旧缓冲区复制数据。如果你不想每次realloc
(大多数时候内部都会memmove
)那么你可以尝试重新分配比实际需要更多的内存。
realloc(buf_ptr, (actual_size + additional_size) * 2);
这种方式会降低调用realloc
(和memmove
)的频率。
注意:realloc
的实现在某些体系结构中是不同的,它永远不会尝试扩展它总是尝试为总大小分配缓冲区的内存。因此,在这些平台中,每次调用memmove
时都会调用realloc
。
答案 3 :(得分:0)
听起来您正在寻找名为灵活数组成员(example)的C功能。它仅适用于C标准C99或更高版本。
结构的最后一个成员必须声明为灵活的数组成员,最初是malloc,后来是realloc(当然还有memcpy来进行实际的复制)。