-4

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

3 回答 3

4

第一种形式更好,因为您的代码更安全;你知道它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 下编译器可以掩盖错误。mallocC++ 仍然需要它,但如果您正在编写 C++,则无论如何都不应该使用它。如果您正在编写必须构建为 C 和 C++ 的代码,请将内存分配代码隐藏在接口后面,并为每个接口以不同的方式实现它。我不是在开玩笑。
  • 在调用中使用sizeof *ptr而不是,例如sizeof (type)malloc
    int *ptr = malloc( sizeof *ptr * number_of_elements );
    如果您更改类型ptr(例如 from int *tounsigned *long *),它将减少维护方面的麻烦。
于 2016-03-17T21:03:20.337 回答
2

“是不是更有效率?”

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

用malloc初始化变量更好吗?

是的,最好用一些东西来初始化一个变量,而不是什么都没有。由于其他原因,OP 代码片段都不是那么好。无需投射malloc()结果。 size_t是比 更好的参数类型intsize_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;
}
于 2016-03-17T21:02:42.933 回答
-1

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

于 2016-03-17T19:56:37.117 回答