使用malloc初始化变量是否更好?

时间:2016-03-17 19:35:00

标签: c function malloc dynamic-memory-allocation coding-efficiency

如果我在函数中有一个指针并且我知道它的大小,那么在指针初始化时使用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;
}

3 个答案:

答案 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初始化一个指针(你没有在第二个片段中)。另外,记住在函数内部为动态分配的变量释放()内存。