如果我在函数中有一个指针并且我知道它的大小,那么在初始化指针时使用malloc
会更好吗?例如如果我有一个功能,这样做会更好
int * func(int size){
int * ptr = (int *) malloc(size);
//some code
return ptr;
}
或者这个
int * func(int size){
int * ptr;
ptr = (int *) malloc(size);
//some code
return ptr;
}
从某种意义上说,第一种形式更好,因为您的代码更安全;您知道ptr
将包含有效的地址值或在首次使用之前NULL
。
第二种形式如果在为它分配有效地址之前不小心使用了ptr
,就会出现问题;如果没有显式初始值设定项,它的初始值是不确定的,如果你在赋值之前不小心使用了ptr
,你的代码可能会也可能不会立即崩溃。
我几乎可以保证,运行时性能或内存占用量不会有可测量的差异,构建时间也不会有可测量的差异。
您应该始终在声明时初始化指针变量,IMO 您应该推迟它们的声明,直到您实际需要它们。 IOW,而不是写这样的东西:
void foo( void )
{
int *ptr = NULL;
/**
* several dozen lines of code
*/
ptr = malloc( sizeof *ptr * number_of_elements );
/**
* do stuff with ptr
*/
}
最好这样写:
void foo( void )
{
/**
* several dozen lines of code
*/
int *ptr = malloc( sizeof *ptr * number_of_elements );
/**
* do stuff with ptr
*/
}
当然,这只能从 C99 开始;如果您使用的是 C89 或更早版本的编译器,则所有声明都必须位于块中的任何可执行语句之前。
通常的尼特:
- 不要投射
malloc
的结果;从C89开始,这是不必要的,在C89下编译器可以掩盖错误。 它仍然是C++所必需的,但如果你正在编写C++无论如何都不应该使用malloc
。 如果要编写必须构建为 C 和 C++ 的代码,请将内存分配代码隐藏在接口后面,并为每个接口以不同的方式实现它。 我不是在开玩笑。 - 在
malloc
调用中使用sizeof *ptr
而不是sizeof (type)
,例如
如果您更改int *ptr = malloc( sizeof *ptr * number_of_elements );
ptr
类型(例如从int *
更改为unsigned *
或long *
),它将减少维护难题。
"有什么效率吗?"
运行时效率差异很小或没有显著差异。 @Jens·古斯泰特
使用 malloc 初始化变量更好吗?
是的,最好用一些东西而不是什么都没有来初始化变量。 由于其他原因,OP 代码片段都不是那么好。无需投射malloc()
结果。 size_t
是比int
更好的参数类型。 size_t
是保存所有数组的大小和sizeof()
结果的正确大小类型。
int *func(int size) {
int *ptr = malloc(size);
//some code
return ptr;
}
目前尚不清楚size
是指int
数组中的元素数量还是单个int
的假定大小。 推荐:
int *func(size_t array_n) {
int *ptr = malloc(sizeof *ptr * array_n);
//some code
return ptr;
}
它们基本相同。我只想给你一个建议,总是用 NULL 初始化指针(你在第二个片段中没有)。另外,请记住为函数内动态分配的变量释放()内存。