重新分配数组(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个元素将是未定义的。