首页 > 代码库 > 认真体会 结构体中的零长度数组

认真体会 结构体中的零长度数组

以前只是知道这个东西,可以解决一些问题,最近自己做一个字符串操作的东东,看了下redis的源码,做个小的总结。

 

struct cl_str_s{    int free;    int len;    char buf[];};

  代码的意思是,我们定义了一个结构体,它有这么三个属性,作用很明显不详细说了。

  思考两个问题:

  1:char buf[]能不能用char *buf代替?

  2:如果我把 buf[] 做一个 char *的转换(方便通用printf方法或者其它),那么给定一个转换后变量的地址,我该怎么获取结构体变量的地址?

  

  问题1:

  使用上是可以替换得。但是使用上会带来一定的麻烦,比如:char *buf 是 malloc 后得到得,那么我们销毁这个结构体,还要特别注意 free 这个东西。

  问题2:

  要解决这个问题,需要知道 sizeof(struct cl_str_s) 只是两个 int 的字节数,那么我们得到一个做完 char * 转换的变量的地址, addr-sizeof(struct cl_str_s) 得到结构体变量的地址,做其它操作。

 

  附:使用应该是:

cl_strcl_str_new(const char *init){    cl_str_t *cst;    ssize_t str_len;
  str_len=sizeof(cl_str_t);
    if(!init||str_len<0){        return NULL;    }
    cst=calloc(1,sizeof(cl_str_t)+str_len+1);    cst->len=str_len;    cst->free=0;    strncpy(cst->buf,init,str_len);    cst->buf[str_len]=\0;    return (char *)cst->buf;}