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

使用malloc初始化变量是否更好?,c,function,malloc,dynamic-memory-allocation,coding-efficiency,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

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

它们基本上是一样的。我只想给你一个建议,总是用NULL初始化指针,你在第二个代码段中没有这样做。另外,请记住为函数中动态分配的变量释放内存

它在任何方面都更有效率吗

运行时效率差异很小或没有显著差异

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

是的,最好用一些东西初始化变量,而不是什么都不初始化。由于其他原因,这两个操作代码片段都没有那么好。无需强制转换malloc结果。size_t是比int更好的参数类型。size_t是保存所有数组大小和sizeof结果的正确大小类型

不清楚大小是指int数组中的元素数还是单个int的假定大小。建议:

int *func(size_t array_n) {
  int *ptr = malloc(sizeof *ptr * array_n);
  //some code
  return ptr;
}

第一种形式更好,因为代码更安全;您知道ptr在第一次使用之前将包含有效的地址值或NULL

如果在分配有效地址之前意外使用ptr,则第二种形式会给您带来问题;如果没有显式的初始值设定项,它的初始值是不确定的,并且如果您在分配给它之前意外地使用了ptr,您的代码可能会也可能不会立即崩溃

我几乎可以保证运行时性能或内存占用不会有可测量的差异,构建时间也不会有可测量的差异

您应该始终在声明时初始化指针变量,并且在您实际需要它们之前,您应该延迟它们的声明。看,不要写这样的东西:

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或更早版本的编译器,则所有声明必须位于块中任何可执行语句之前

通常的NIT:

不要抛出malloc的结果;对于C89来说,这是不必要的,在C89下,编译器可以屏蔽bug。它仍然是C++所需要的,但是如果你正在编写C++,你无论如何也不应该使用Maloc。如果你编写的代码必须建立为C和C++,隐藏你的内存分配代码在一个接口后面,并为每个实现不同。我不是开玩笑。 在malloc调用中使用sizeof*ptr而不是sizeof type,例如,如果您将ptr的类型从int*更改为unsigned*或long*,那么它将减少维护方面的麻烦。
int *ptr = malloc( sizeof *ptr * number_of_elements );

我会使用int*ptr=mallocsizeof*ptr*size;我想知道您的代码的大小是否考虑了sizeofint。请更好地定义这个术语。第二个不是初始值设定项,而是初始赋值。@Olaf在C中,对于标量类型,T a=b;定义为与T a相同;a=b;所以这不是一个大问题。@M.M:请记住,其他初学者会读到这篇文章,他们认为这可以用于数组和结构之类的复合类型。在C89中,通常可以通过使用声明启动块来实现相同的目标。如果这会使代码变得丑陋,那么就不要考虑有这么大的功能。如果编写C和C++所需的代码,另一种方法是将分配代码放在C文件中,C++允许C对象成为链接,他想用MALOC的结果初始化指针。在此之前添加额外的NULL不仅是多余的,而且可能会隐藏编译器关于意外使用变量的警告,并使编译器更难进行优化,例如,优化器可能会将该指针的空间与malloc之后未使用的另一个变量共享。@M.M我一直被教导总是初始化变量。指针是变量,因此我用NULL初始化它们。对我来说,初始化变量似乎是一个很好的实践,原因很多,但对我来说,这似乎是一个不好的实践,原因我提到过。无论哪种方式,都应该通过在准备初始化变量之前不声明变量来避免问题。@M.M那么,这只是一个优化问题吗?是的,还有可读性和代码正确性。没有初始值设定项表示尚未读取该变量,如果您尝试读取该变量,现代编译器将发出警告。
int *ptr = malloc( sizeof *ptr * number_of_elements );