需要说明几点:
我看不到您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()
and的返回值是值得怀疑的。realloc()
考虑:
// functionally identical in C
char *a = malloc(10);
char *b = (char *)malloc(10);
在 C++ 中,必须进行强制转换,因为在 C++void *
中不能隐式转换为另一种指针类型。(我认为这是一个语言错误,但这不是我判断的地方。)如果您的代码是 C++,那么您应该使用new
anddelete
无论如何。如果您的代码是 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
1double
个位置。此外,始终使用sizeof *obj
而不是sizeof(type)
从不使用强制转换意味着以后的调用realloc()
可以在没有任何更改的情况下工作,而使用强制转换和显式类型名称将需要找到您调用realloc
的任何位置并更改强制转换和sizeof
s。另外,如果您忘记了,请执行以下操作:
double *array = (float *)malloc(10 * sizeof(float));
在大多数平台上,array
现在只有 5 个元素的数组,假设对齐没有关闭并且编译器不会抱怨您将 a 分配float *
给 a double *
。有些人认为编译器发出的警告很有帮助,因为它指出了可能不正确的行。但是,如果我们避免sizeof(type)
并避免强制转换,我们可以看到这些行不会不正确,因此让编译器注意它们是在浪费我们可以用来编程的时间。