在我使用C编码的经历中,我已经看到了两种传递函数参数的方法:
malloc 在调用函数之前
malloc 内部函数(变量在调用函数之前未初始化)
我特别喜欢第二种形式.虽然我是唯一一个编写程序的人,但我知道,但其他一些人不知道,并且可能导致2 malloc,并且内存泄漏.
所以,我的问题是:这是最好的做法是什么?
R..*_*R.. 10
在调用者中分配内存更加灵活,因为它允许调用者使用静态或自动存储而不是动态分配,并且无需处理被调用者中分配失败的情况.另一方面,让呼叫者提供存储需要呼叫者提前知道大小.如果将大小编译为调用者作为常量,并且被调用者位于稍后更新为使用更大结构的库中,那么事情将会非常糟糕.当然,您可以通过提供第二个函数(或库中的外部变量)来检索必要的大小来避免这种情况.
如有疑问,您可以随时使用两个功能:
然后调用者可以自由选择哪种方法更适合特定用例.
我个人非常支持你的第一个命题(只要有可能)正交性.请看以下示例:
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.