如果我在函数中有一个指针并且我知道它的大小,那么在指针初始化时使用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;
}
答案 0 :(得分:3)
第一种形式在代码更安全的意义上更好;您知道ptr
在首次使用之前会包含有效的地址值或NULL
。
如果您在为其分配有效地址之前意外使用ptr
,则第二种形式会让您遇到问题;如果没有显式初始值设定项,则其初始值为 indeterminate ,如果在分配之前意外使用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 ++的代码,请在接口后面隐藏内存分配代码,并为每个代码实现不同的代码。我不是在开玩笑。 sizeof *ptr
来电中使用sizeof (type)
代替malloc
,例如int *ptr = malloc( sizeof *ptr * number_of_elements );
如果您更改了ptr
的类型,它将减少维护难题(从int *
到unsigned *
或long *
说。 答案 1 :(得分:2)
"它在任何方面都更有效吗?"
很少或没有显着的运行时效率差异。 @Jens Gustedt
使用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;
}
答案 2 :(得分:-1)
它们基本相同。我想给你一个建议,总是用NULL初始化一个指针(你没有在第二个片段中)。另外,记住在函数内部为动态分配的变量释放()内存。