首页 > 代码库 > 认真体会 结构体中的零长度数组
认真体会 结构体中的零长度数组
以前只是知道这个东西,可以解决一些问题,最近自己做一个字符串操作的东东,看了下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;}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。