【问题标题】:Is it better to initialize a variable with malloc? [closed]用malloc初始化变量更好吗? [关闭]
【发布时间】:2016-07-04 08:45:28
【问题描述】:

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

【问题讨论】:

  • 我会使用int * ptr = malloc(sizeof *ptr * size); 我想知道您的代码的size 是否考虑到sizeof(int)
  • 请定义“更好”这个词。
  • 第二个不是初始化器,而是(初始)赋值。
  • @Olaf 在 C 中,对于标量类型,T a = b; 被定义为与 T a; a = b; 相同,所以这不是一个大问题。
  • @M.M:请记住,其他初学者会阅读这篇文章,他们认为这可以用于数组和structs 等复合类型。

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


【解决方案1】:

第一种形式更好,因为您的代码更安全;您知道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++ 的代码,请将内存分配代码隐藏在接口后面,并为每个接口以不同的方式实现它。我不是在开玩笑。
  • malloc 调用中使用sizeof *ptr 而不是sizeof (type),例如
    int *ptr = malloc( sizeof *ptr * number_of_elements );
    如果您更改ptr 的类型(例如从@ 987654334@ 至unsigned *long *)。

【讨论】:

  • 在 C89 中,您通常可以通过以声明开头的块来实现相同的目标。如果这让你的代码变得丑陋,那么考虑不要有这么大的函数。
  • 如果编写必须为 C 和 C++ 构建的代码,另一种方法是将分配代码放在 C 文件中(C++ 允许链接 C 对象)
【解决方案2】:

“在任何方面它更有效吗?”

运行时效率差异很小或没有显着差异。 @Jens Gustedt

用malloc初始化变量会更好吗?

是的,最好用一些东西来初始化一个变量,而不是什么都没有。由于其他原因,OP 代码 sn-ps 都不是那么好。无需投射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;
}

【讨论】:

    【解决方案3】:

    它们基本相同。我只想给你一个建议,总是用 NULL 初始化一个指针(你没有在第二个 sn-p 中)。另外,请记住为函数内动态分配的变量释放()内存。

    【讨论】:

    • 他想用malloc的结果初始化指针。在此之前添加一个额外的NULL 不仅是多余的,而且可能隐藏有关意外使用变量的编译器警告,并使编译器更难优化(例如,优化器可能与另一个变量共享该指针的空间在 malloc 之后不使用)。
    • @M.M 我被教导要始终初始化变量。指针是变量,因此我用 NULL 初始化它们。对我来说,初始化变量似乎是一种很好的做法,原因有很多。
    • 由于我提到的原因,这对我来说似乎是一种不好的做法。无论哪种方式,都应该通过在准备好初始化变量之前不声明变量来避免该问题。
    • @M.M 那么,这只是一个“优化问题”吗?
    • 是的,还有可读性和代码正确性。没有初始化程序表明该变量还没有被读取,如果您尝试读取它,现代编译器会发出警告。
    猜你喜欢
    • 1970-01-01
    • 2023-01-20
    • 2015-04-15
    • 2014-08-15
    • 1970-01-01
    • 2021-05-07
    • 2013-05-22
    • 2013-05-01
    • 1970-01-01
    相关资源
    最近更新 更多