zoukankan      html  css  js  c++  java
  • 认真体会 结构体中的零长度数组

    以前只是知道这个东西,可以解决一些问题,最近自己做一个字符串操作的东东,看了下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]='';
    
        return (char *)cst->buf;
    }
  • 相关阅读:
    block、inline、inline-block
    js 的复制和引用 (传值和传址)
    俄罗斯方块和作品集
    js 连续赋值。。理解不了,先占坑
    8.7 jquery-dom manipulation
    08.04 对象构造方法
    对象的基本操作
    08.03 js _oop
    08.02 对象
    The 'Microsoft.ACE.OLEDB.12.0' provider is not registered on the local machine.
  • 原文地址:https://www.cnblogs.com/claresun/p/3838011.html
Copyright © 2011-2022 走看看