可能重复:
指针作为第二个参数而不是返回指针?
我看到了很多:
Monkey* test = malloc(sizeof(Monkey));
Monkey_New(test);
Run Code Online (Sandbox Code Playgroud)
让init函数返回指针会不会更清晰?
Monkey* test = Monkey_New();
Run Code Online (Sandbox Code Playgroud)
为什么经常以第一种方式完成?
这两种设计在功能上极为不同.你问的问题会给调用者带来分配的负担.这具有巨大的优势,即malloc如果对象不必使调用者不活动,则可以避免动态存储(); 它可以存储在自动变量中.这也意味着,假设init函数不必获取更多资源,您可以使用无故障API,其中调用者不必检查失败.另一方面,它要求结构的定义(至少大小)暴露给调用模块,这意味着如果更新库代码以使用更大尺寸的对象,则必须重新编译调用者; 因此,对于具有长期稳定ABI的共享库,它可能是负面的.
在您指出的替代设计中,获取存储的负担在被调用者(库函数)上,并且它必须使用动态存储(malloc),因为自动存储在返回调用者时不会存在.这更抽象,更清洁,