自己的C库,与内存相关

时间:2019-05-05 06:29:32

标签: c

我正在编写一个用于字符串管理的C库,它尽可能地类似于python接口,但是我有以下问题:

我的图书馆应该分配内存,还是客户端必须这样做?

例如,请参阅我的center方法:

char * center(char * str, int width, char fillchar)

此方法的问题在于,每次调用此方法时,客户端都必须释放。

在此处查看更多信息:

https://github.com/jiss2891/pystrings

1 个答案:

答案 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 ,并在溢出时将其环绕。这样更加灵活,并且需要几行(但不是很多)额外的代码行。