在我的C程序中,我经常需要一种方法来对我的ADT进行字符串表示。即使我不需要以任何方式将字符串打印到屏幕上,使用这种调试方法也很简洁。因此,经常会出现这种功能。
char * mytype_to_string( const mytype_t *t );
我实际上意识到我在这里有(至少)三个选项来处理返回字符串的内存。
备选方案1:将返回字符串存储在函数的静态char数组中。除了每次调用都会覆盖该字符串外,我不需要太多思考。在某些情况下这可能是个问题。
备选方案2:使用函数内部的malloc在堆上分配字符串。真的很整洁,因为我那时无需考虑缓冲区的大小或覆盖的问题。但是,我确实必须记得在完成操作后将字符串free(),然后还需要分配一个临时变量,以便可以释放。然后堆分配实际上比堆栈分配要慢得多,因此如果在循环中重复进行,则将成为瓶颈。
备选方案3:将指针传递到缓冲区,然后让调用方分配该缓冲区。喜欢:
char * mytype_to_string( const mytype_t *mt, char *buf, size_t buflen );
这给呼叫者带来了更多的努力。我还注意到,该替代方案在参数顺序方面为我提供了另一个选择。我应该首先讨论哪个论点?(实际上有六种可能性)
那么,我该选择哪个呢?为什么?C开发人员中是否存在某种不成文的标准?
sysctlbyname
在OS X和iOS中