17

谁能总结一下正确用法是realloc()什么?

realloc()失败的时候怎么办?

从我目前看到的情况来看,如果realloc()失败,你必须使用free()旧指针。真的吗?

这是一个例子:

   1.  char *ptr = malloc(sizeof(*ptr) * 50);
   2.  ...
   3.  char *new_ptr = realloc(ptr, sizeof(*new_ptr) * 60);
   4.  if (!new_ptr) {
   5.      free(ptr);
   6.      return NULL;
   7.  }

假设realloc()在线失败3。我在网上做正确的5free()ptr

4

4 回答 4

20

来自http://www.c-faq.com/malloc/realloc.html

如果 realloc 根本找不到足够的空间,它会返回一个空指针,并保留先前分配的区域。

因此,您确实需要释放先前分配的内存。

于 2010-07-25T22:13:02.767 回答
1

这取决于你想做什么。当realloc失败时,你想做什么:释放旧块还是让它保持活跃和不变?如果你想释放它,那就释放它。

还要记住,在 C89/90 中,如果您发出realloc目标大小为零的请求,realloc即使原始内存已成功释放,函数也可能返回空指针。这是 C89/90 中的一个缺陷,因为在返回 null 时无法区分成功与失败。

在 C99 中,这个缺陷得到了修复,并且保证了 null 返回和重新分配成功/失败之间的严格关系。在 C99 中,null 返回总是意味着realloc.

于 2010-07-25T22:19:12.150 回答
0

如果 realloc 失败,我认为您不会想要删除原始块,因为您将丢失它。似乎 realloc 将调整旧块的大小(或返回指向新位置的指针),成功时将返回指向旧块(或新位置)的指针,失败时将返回 NULL。如果它无法分配新块,则旧块保持不变。

于 2010-07-25T22:25:00.097 回答
-3

编辑:更正,有些人因为我所说的而抨击我,你分配指针的方式似乎是其中的最佳实践,我被教导总是在 中使用类型转换sizeof(),但显然你的方式更正确,所以无视我说的 =)

看看http://en.wikipedia.org/wiki/Malloc#realloc之前可能对你有好处。

您不太明白sizeof()- 它具有您传递给它的参数大小的值(以字节为单位)。例如,sizeof(int)在大多数 32 位系统上将为 4,但您仍应使用sizeof(int)4因为在 64 位系统上编译代码(仅作为示例)将使该值等于 8,并且您的代码仍然可以正常编译。你分配内存是为了什么?指针?如果是这样,你应该sizeof(void*)改用(你可以说sizeof(int*),但通常的约定是不要向编译器提及你想在这些指针上存储什么,因为所有指针都应该是相同的大小 - 所以大多数程序员说sizeof(void*)),如果你需要字符空间使用sizeof(char)等等。

然而,将返回值存储realloc()在新指针中并检查它是正确的,尽管许多程序员会假设系统总是有足够的内存并侥幸逃脱。

于 2010-07-25T22:21:40.717 回答