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



如果我在函数中有一个指针并且我知道它的大小,那么在初始化指针时使用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 初始化指针(你在第二个片段中没有)。另外,请记住为函数内动态分配的变量释放()内存。

相关内容

  • 没有找到相关文章

最新更新