重新分配数组(C99)

时间:2010-07-20 21:12:14

标签: c memory-management c99

如果新的大小更大,则重新分配空间的内容未定义的标准specifies

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

实现像动态增长的数组这样的数据结构的最佳方法是否只能以链表的形式增长?

4 个答案:

答案 0 :(得分:5)

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

我说:

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个“新”字符都是未定义的。

答案 1 :(得分:4)

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

不,不。它说:

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

仅指定新零件的内容。重新分配后没有任何损失。

答案 2 :(得分:3)

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

不需要黑客攻击,只需要realloc()。

答案 3 :(得分:2)

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