分配内存以供函数使用的最佳实践 - malloc内部或外部?

raf*_*omi 6 c malloc

在我使用C编码的经历中,我已经看到了两种传递函数参数的方法:

  1. malloc 在调用函数之前

  2. malloc 内部函数(变量在调用函数之前未初始化)

我特别喜欢第二种形式.虽然我是唯一一个编写程序的人,但我知道,但其他一些人不知道,并且可能导致2 malloc,并且内存泄漏.

所以,我的问题是:这是最好的做法是什么?

R..*_*R.. 10

在调用者中分配内存更加灵活,因为它允许调用者使用静态或自动存储而不是动态分配,并且无需处理被调用者中分配失败的情况.另一方面,让呼叫者提供存储需要呼叫者提前知道大小.如果将大小编译为调用者作为常量,并且被调用者位于稍后更新为使用更大结构的库中,那么事情将会非常糟糕.当然,您可以通过提供第二个函数(或库中的外部变量)来检索必要的大小来避免这种情况.

如有疑问,您可以随时使用两个功能:

  1. 使用调用者提供的存储的主要功能.
  2. 一个分配适当数量的存储的包装函数,使用它调用#1中的函数,并将指针返回给调用者.

然后调用者可以自由选择哪种方法更适合特定用例.


oua*_*uah 8

我个人非常支持你的第一个命题(只要有可能)正交性.请看以下示例:

extern void bar(int *p, int n);

void foo(int n)
{

   int *p = malloc(n * sizeof *p);

   // fill array object
   bar(p, n);

   // work with array elements

   /* ... */

   // array no longer needed, free object
   free(p);
}
Run Code Online (Sandbox Code Playgroud)

这是正交的.malloc并且free在相同的词法范围内调用,该范围清晰可读.另一个优点是您可以传递给bar具有不同存储持续时间的阵列,例如具有自动或静态存储持续时间的阵列.你让bar函数只关注它所做的工作,让另一个函数管理数组分配.

请注意,这也是所有标准C功能的工作方式:它们似乎永远不会调用malloc.