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

以前只是知道这个东西,可以解决一些问题,最近自己做一个字符串操作的东东,看了下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;
}

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

时间: 2024-08-11 14:41:23

认真体会 结构体中的零长度数组的相关文章

GNU C中的零长度数组

http://blog.csdn.net/ssdsafsdsd/article/details/8234736 在标准C和C++中,长度为0的数组是被禁止使用的.不过在GNU C中,存在一个非常奇怪的用法,那就是长度为0的数组,比如Array[0];很多人可能觉得不可思议,长度为0的数组是没有什么意义的,不过在这儿,它表示的完全是另外的一层意思,这个特性是不可移植的,所以,如果你致力于编写可移植,或者是稍稍需要跨平台的代码,这些Trick最好还是收起来的好. 在GNU的指南中,它是如此写道: s

读陈浩的《C语言结构体里的成员数组和指针》总结,零长度数组

原文链接:C语言结构体里的成员数组和指针 复制如下: 单看这文章的标题,你可能会觉得好像没什么意思.你先别下这个结论,相信这篇文章会对你理解C语言有帮助.这篇文章产生的背景是在微博上,看到@Laruence同学出了一个关于C语言的题,微博链接.微博截图如下.我觉得好多人对这段代码的理解还不够深入,所以写下了这篇文章. 为了方便你把代码copy过去编译和调试,我把代码列在下面: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #include <stdio.h>

关于零长度数组

声明:本文主要转载了http://coolshell.cn/articles/11377.html文章中关于 "零长度数组的内容",在此对原作者表示感谢 1. 前言 首先,我们要知道,0长度的数组在ISO C和C++的规格说明书中是不允许的.这也就是为什么在VC++2012下编译你会得到一个警告:"arning C4200: 使用了非标准扩展 : 结构/联合中的零大小数组". 那么为什么gcc可以通过而连一个警告都没有?那是因为gcc 为了预先支持C99的这种玩法,

结构体中的指针与零长度数组

0长度的数组在ISO C和C++的规格说明书中是不允许的,但是由于gcc 预先支持C99的这种玩法,所以,"零长度数组"在gcc环境下是合法的. 先看下面两个例子. pzeroLengthArray.c #include <stdio.h> struct str { int len; char *s; }; struct foo { struct str *a; }; int main() { struct foo f = {0}; printf("sizeof(

结构体中最后一个成员为[0]或[1]长度数组(柔性数组成员)的用法

结构体中最后一个成员为[0]长度数组的用法:这是个广泛使用的常见技巧,常用来构成缓冲区.比起指针,用空数组有这样的优势:(1).不需要初始化,数组名直接就是所在的偏移:(2).不占任何空间,指针需要占用int长度空间,空数组不占任何空间.“这个数组不占用任何内存”,意味着这样的结构节省空间:“该数组的内存地址就和它后面的元素地址相同”,意味着无需初始化,数组名就是后面元素的地址,直接就能当指针使用. 这样的写法最适合制作动态buffer,因为可以这样分配空间malloc(sizeof(struc

C#中结构体定义并转换字节数组

最近的项目在做socket通信报文解析的时候,用到了结构体与字节数组的转换:由于客户端采用C++开发,服务端采用C#开发,所以双方必须保证各自定义结构体成员类型和长度一致才能保证报文解析的正确性,这一点非常重要. 首先是结构体定义,一些基本的数据类型,C#与C++都是可以匹配的: [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)] public struct Head { public

结构体中的数据对齐

c语言结构中需要注意的就是数据存储的对齐方式. 对齐的好处:对齐主要是为了方便数据的访问,提高计算机的处理速度,但同时它会浪费内存空间. CPU的优化规则大致是这样的:对于n字节的元素,它的首地址能被n整除,才能获得最好的性能. 对齐的使用原则: 1.一般的基本对齐原则是按着最大的基本类型的长度进行对齐.较小的元素可以组合起来填充一段内存,实现基本的对齐.前提是其满足条件2. 2.结构体中的元素也要满足一定的分布条件,就是元素的存储起始地址要满足能够整除该元素类型的长度. 3.在结构体中存在结构

结构体中的位域

在储存信息时,有时并不需要一个字节的空间而是只需要几个二进制位就足够了.因此在C语言中为了节省空间提高效率,因此引出了位域(也叫位段)的概念. 如下代码中: #include<stdio.h> typedef struct Test { char a : 1; char b : 1; char c : 1; }Test; void main() { printf("sizeof(Test) = %d\n",sizeof(Test)); } a,b,c都是字符类型,而每个字符

C结构体中位域

C结构体中位域的一点小知识,最近在看资料时遇到结构体中的一种特殊操作——位域,在下面的程序中我将根据自己的理解进行简单介绍.程序只是为了了解位域的一些性质,运行时有些编译器可能会报错. 程序代码如下(C++编写),编译器使用的是C-Free,整型变量占4个字节.(由于刚接触,如有错误,还请大家指正.) 1 #include<iostream> 2 using namespace std; 3 4 struct bit { 5 int a:3; 6 int b:2; 7 int c:3; 8 }