我正在编写一个用于字符串管理的C库,它尽可能地类似于python接口,但是我有以下问题:
我的图书馆应该分配内存,还是客户端必须这样做?
例如,请参阅我的center
方法:
char * center(char * str, int width, char fillchar)
此方法的问题在于,每次调用此方法时,客户端都必须释放。
在此处查看更多信息:
答案 0 :(得分:1)
很多时候,我在编写此类函数时,它们只是出于格式化的目的,因此不再需要居中或修饰漂亮的字符串。出于安全考虑,通常我会在函数中声明一个静态的环绕缓冲区,如下所示……
char *center_or_whatever ( char *instring, int some_param /*,etc*/ ) {
/* --- wrap-around buffer --- */
#define NBUFFS 999
#define BUFFWIDTH 999
static char buffer[NBUFFS][BUFFWIDTH];
static int ibuff = 999999;
char *outstring = NULL;
/* --- assign next buffer to outstring --- */
if ( ++ibuff >= NBUFFS ) ibuff=0;
outstring = buffer[ibuff];
/* --- check to make sure instring and other params won't make
outstring exceed BUFFWIDTH, truncate (or whatever) if necessary, etc --- */
/* --- now do whatever your function's supposed to do --- */
strcpy(outstring,instring); /* just for example */
return ( outstring );
} /* --- end-of-center_or_whatever() --- */
...所以现在,只要用户不需要输出超过函数的NBUFFS调用,并且不需要输出,就不再需要分配或释放任何东西了。超过BUFFWIDTH个字符。可以说这些都不是安全的假设,但是我经常发现类似NBUFFS = 64和BUFFWIDTH = 128的东西对于我当时正在编程的目的来说已经足够安全了。而且[64] [128]个字节的静态分配几乎是不明显的。因此,对于我来说,大多数时候,不用担心malloc / free的便捷性和安全性就值得额外的几个字节和额外的几行代码。
请注意,您还可以声明一个长而长的静态字符缓冲区[99999]; ,并维护一个初始化为 static char * buffptr = buffer 的指针。然后在每次通话期间,将 outstring 分配给当前的 buffptr ,碰撞 buffptr ,并在溢出时将其环绕。这样更加灵活,并且需要几行(但不是很多)额外的代码行。