重新分配数组(C99)

该标准指定如果新大小(如果更大),则重新分配空间的内容是未定义的。

如果保留先前分配的空间的内容很重要,那么重新分配数据的最佳方法如下:将其复制到堆栈,从堆中释放它,在堆上分配更多空间,然后复制回堆? 还有另一种安全的方法吗?

实现数据结构的最佳方法是像动态增长的数组一样只能以链表的forms增长吗?

“未分配对象的新分配部分”的内容。 您的内容仍将位于返回的内存区域的开头。

说我同意:

char *p = malloc(6); if(p == NULL) { ... } memcpy(p, "Hello", 6); char *temp = realloc(p, 12); if(temp == NULL) { ... } p = temp; 

p的前6个字符保证为’H’,’e’,’l’,’l’,’o’,’\ 0’,无论新p是否与旧p相同。 其余6个“新”字符都是未定义的。

“如果新的大小更大,标准规定重新分配空间的内容是不确定的。”

不,不。 它说:

“物体的内容应保持不变,直至新旧尺寸中的较小者。” “如果新的大小较大,则未指定新分配的对象部分的内容。”

仅指定新部件的内容。 realloc之后没有任何东西丢失。

你误读了这个页面。 它说:“物体的内容应保持不变,直至新旧尺寸中的较小者。”

不需要hacks,只需realloc()。

只有内存的新部分是未定义的。 例如,如果你有一个包含10个元素的数组,并且你将它重新分配给20个元素足够大,那么最后10个元素将是未定义的。