以前只是知道这个东西,可以解决一些问题,最近自己做一个字符串操作的东东,看了下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_str cl_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; }
认真体会 结构体中的零长度数组,布布扣,bubuko.com
原文地址:http://www.cnblogs.com/claresun/p/3838011.html