当realloc()失败并返回NULL时,它的正确用法是什么?

任何人都可以总结一下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行失败。 我是否通过free() ing ptr在第5行做正确的事情?

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

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

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

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

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

在C99中,这个缺陷是固定的,并且保证了无效返回和重新分配成功/失败之间的严格关系。 在C99中,null return总是表示realloc完全失败。

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

编辑:更正,有些人正在抨击我所说的,你分配指针的方式似乎是他们中的最佳实践,我被教导总是使用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()的返回值存储在一个新的指针中并检查它,尽管许多程序员会认为系统总是有足够的内存并且可以使用它。