几个点使:
我看不出你如何在代码中使用realloc()
,但如果你使用它这样的,这是错误的:
variable = realloc(variable, amount);
当它是无法分配更多内存,realloc()
返回NULL
,但保持原始指针不变。在上面的行中,这意味着variable
是NULL
,我们已经失去了它指向的内存的访问权限,但是该内存没有被释放。正确的成语是:
void *tmp = realloc(variable, amount);
if(tmp)
{
// success! variable invalid, tmp has new allocated data
variable = tmp;
}
else
{
// failure! variable valid, but same size as before, handle error
}
你应该使用第二个是因为,与realloc()
,失败是坏的,但在许多情况下相当可回收,不像malloc()
哪里失败通常意味着其原因“停止一切与死亡“。
这是一个比较有争议的问题,但是您是否应该像以前一样使用malloc()
和realloc()
作为返回值。考虑:
// functionally identical in C
char *a = malloc(10);
char *b = (char *)malloc(10);
在C++中,铸造必须制成,因为在C++ void *
不能隐式转换为另一种指针类型。 (我认为这是一种语言错误,但它不是我的判断依据。)如果您的代码是C++,那么无论如何您应该使用new
和delete
。如果你的代码是C但需要用C++编译器进行编译(出于某种原因),你别无选择,只能进行强制转换。如果您不需要使用C++编译器编译C代码(类似于必须在Python解释器中运行Ruby代码),请继续以下几点,这就是我认为您不应该投射的原因。
在C89,如果没有被声明使用的功能,它将被隐式地声明为返回一个int
。如果我们忘记了#include <stdlib.h>
并且我们调用malloc()
,那么没有强制转换的版本会导致编译器错误(不允许隐式强制转换int
到char *
),而带有强制转换的版本会(错误地)告诉编译器“我知道这听起来很疯狂,但无论如何都要投它。“大多数编译器会给你一个隐含的(或不兼容的)声明,像malloc()
这样的内置函数的声明,但是演员确实很难找到它。
假设你有一些数据:
float *array = (float *)malloc(10 * sizeof(float));
后来,你发现你需要在你的数据更加精确,并有使这个double
阵列。在上面的线,你需要改变不超过3个不同的地方:
double *array = (double *)malloc(10 * sizeof(double));
如果,另一方面,你这样写:
float *array = malloc(10 * sizeof *array);
你只需要改变float
到double
在1个地方。此外,始终使用sizeof *obj
代替sizeof(type)
从不使用强制转换意味着对realloc()
以后的调用可以工作没有任何变化,而使用强制转换和显式定义名称将需要找到任何你叫realloc
和改变铸件和sizeof
秒。另外,如果你忘了,而做到这一点:
double *array = (float *)malloc(10 * sizeof(float));
在大多数平台上,array
现在只有5个元素的数组,假设对准不关闭,编译器不抱怨你将float *
分配给double *
。有些人认为编译器发出的警告是有帮助的,因为它指出了可能不正确的行。但是,如果我们避免sizeof(type)
并避免投射,我们可以看到行不会是不正确,因此让编译器引起他们的注意力正在浪费时间来编程。
什么警告并GDB给你? – ezod 2010-01-31 20:38:57