下面这个结构体,可以在malloc的时候指定数据data的长度,这样的形式就是变长数组
typedef struct
{
  int data_len;
  char data[0];//或char data[];
}buff_st_a;

用法:在下面的例子中,
buff_st_b和buff_st_a用法相同,用数组名来表示数据地址,这时数据是紧挨着p_struct的,这样p_struct和p_data不用各自分开分配和释放,使用起来很方便;
buff_st_p用指针来存储数据地址,这时数据的地址并不是紧挨着p_struct的,p_struct和p_data必须各自分开分配和释放;

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h> typedef struct
{
int data_len;
char data[0];
}buff_st_a; typedef struct
{
int data_len;
char data[];
}buff_st_b; typedef struct
{
int data_len;
char *data;
}buff_st_p; typedef struct
{
uint32_t id;
uint32_t age;
}data_st; void show_data(const data_st *data)
{
printf("data:\n id :%u,age :%u\n\n", data->id, data->age);
}
void show_addr(char* type, void* p_buf)
{
  printf("for %s,\naddress:\n ", type);   if(0 == strcmp(type, "buff_st_a")){
    buff_st_a *pbuf = (buff_st_a*)p_buf;
    printf("pbuf :%p\t,pbuf->data_len :%p\t,pbuf->data :%p\t\n",
pbuf, &(pbuf->data_len), pbuf->data);
  }else if(0 == strcmp(type, "buff_st_b")){
    buff_st_b *pbuf = (buff_st_b*)p_buf;
    printf("pbuf :%p\t,pbuf->data_len :%p\t,pbuf->data :%p\t\n",
pbuf, &(pbuf->data_len), pbuf->data);
  }else if(0 == strcmp(type, "buff_st_p")){
    buff_st_p *pbuf = (buff_st_p*)p_buf;
    printf("pbuf :%p\t,pbuf->data_len :%p\t,pbuf->data :%p\t\n",
pbuf, &(pbuf->data_len), pbuf->data);
} } int useage()
{
data_st *data = (data_st *)malloc(sizeof(data_st));
data->id = 100;
data->age = 23; buff_st_a *buffa = (buff_st_a *)malloc(sizeof(buff_st_a) + sizeof(data_st));
buffa->data_len = sizeof(data_st);
memcpy(buffa->data, data, buffa->data_len);
show_addr("buff_st_a", buffa);
show_data((data_st*)buffa->data); buff_st_b *buffb = (buff_st_b *)malloc(sizeof(buff_st_b) + sizeof(data_st));
buffb->data_len = sizeof(data_st);
memcpy(buffb->data, data, buffb->data_len);
show_addr("buff_st_b", buffb);
show_data((data_st*)buffb->data); buff_st_p *buffp = (buff_st_p *)malloc(sizeof(buff_st_p));
buffp->data_len = sizeof(data_st);
buffp->data = (char *)malloc(buffp->data_len);
memcpy(buffp->data, data, buffp->data_len);
show_addr("buff_st_p", buffp);
show_data((data_st*)buffp->data); free(buffa); free(buffb); free(buffp->data);
free(buffp); free(data);
return 0;
} int main()
{
useage();
return 0;
}

  

/*
for buff_st_a,
address:
pbuf :0x892f018 ,pbuf->data_len :0x892f018 ,pbuf->data :0x892f01c
data:
id :100,age :23

for buff_st_b,
address:
pbuf :0x892f028 ,pbuf->data_len :0x892f028 ,pbuf->data :0x892f02c
data:
id :100,age :23

for buff_st_p,
address:
pbuf :0x892f038 ,pbuf->data_len :0x892f038 ,pbuf->data :0x892f048
data:
  id :100,age :23

*/

C语言变长数组data[0]【总结】

char data[0]用法总结

c语言,变长数组的更多相关文章

  1. C语言变长数组 struct中char data[0]的用法

    版权声明:本文为博主原创文章,未经博主允许不得转载. 今天在看一段代码时出现了用结构体实现变长数组的写法,一开始因为忘记了这种技术,所以老觉得作者的源码有误,最后经过我深思之后,终于想起以前看过的用s ...

  2. C语言变长数组data[0]总结

    C语言变长数组data[0] 1.前言 今天在看代码中遇到一个结构中包含char data[0],第一次见到时感觉很奇怪,数组的长度怎么可以为零呢?于是上网搜索一下这样的用法的目的,发现在linux内 ...

  3. C语言变长数组data[0]

    1.前言 在刷题时遇到一个结构中包含char data[0],第一次见到时感觉很奇怪,数组的长度怎么可以为零呢?于是上网搜索一下这样的用法的目的,发现在linux内核中,结构体中经常用到data[0] ...

  4. C语言变长数组data[0]【总结】

    1.前言 今天在看代码中遇到一个结构中包含char data[0],第一次见到时感觉很奇怪,数组的长度怎么可以为零呢?于是上网搜索一下这样的用法的目的,发现在linux内核中,结构体中经常用到data ...

  5. C语言变长数组

    #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct Variable ...

  6. GCC 中零长数组与变长数组

    前两天看程序,发现在某个函数中有下面这段程序: int n; //define a variable n int array[n]; //define an array with length n 在 ...

  7. C++内存分配及变长数组的动态分配

    //------------------------------------------------------------------------------------------------ 第 ...

  8. PL/SQL 嵌套表变长数组和索引表[转]

    关于PL/SQL中这三种数组的介绍,不想写了.转一篇日志吧…… 链接:http://www.blogjava.net/decode360/archive/2008/08/08/280825.html ...

  9. 《OOC》笔记(3)——C语言变长参数va_list的用法

    <OOC>笔记(3)——C语言变长参数va_list的用法 C语言中赫赫有名的printf函数,能够接受的参数数目不固定,这就是变长参数.C#里也有params这个关键字用来实现变长参数. ...

随机推荐

  1. C#变量命名规范

    1.1命名 1.  所有命名必须有意义 2.  成员变量声明在类的顶端,并且每个变量一行 3.  局部变量声明在引用之前 1.1.1  常量命名 1.  常量名用全大写:MAX_PARAMETER_C ...

  2. poj 1604 Just the Facts

    /** 大意: 求n! 结果 从左到右 第一个非零数 跟 1150 差不多.. **/ #include <iostream> #include <cstdio> using ...

  3. Regex阅读笔记(三)之固化分组

    符号:?> 使用?>的匹配与正常的匹配无区别,但是如果匹配进行到此结构之后,此结构体的所有备用状态都会放弃,也就是括号内的子表达式中未尝试过的备用状态都不复存在了. 例如'(\.\d\d( ...

  4. hibernate的配置 1

    hibernate 是一种ORM框架,是ORM框架中一个典范 ORM叫做对象关系映射 是面向对象语言和关系型数据库之间的映射关系 所以只有在面向对象语言或者关系型数据库没用的时候ORM才会消失 ORM ...

  5. eclipse svn2.0.0插件 手动安装方法

    org.tigris.subversion.javahl.ClientException: Unsupported working copy formatsvn: This client is too ...

  6. Android之drawable state各个属性具体解释

    我们在定义一个drawable的时候能够通过xml定义的drawable对象.它使得一个图片能在不同的状态下显示不同的图案,比方一个Button,它有pressed.focused,或者其他状态,通过 ...

  7. DTM initialization: failure during startup recovery, retry failed, check segment status (cdbtm.c:1603)

    安装greenplum集群出现以下错误: 20160315:13:49:16:025696 gpinitsystem:h95:jason-[INFO]:-Checking configuration ...

  8. python学习(2)

    编码: 需要注意的是:python 没有字符的概念,但是比如a='abcd',当中字母a占用一个字节,通过 方法len我们可以求出这个字符变量a所有字符个数,如:print len(a)显示结果为:4 ...

  9. 关于QuartusII对ram块的综合

    之前在看Altera的官方教程上就有说明,如果我们定义一个reg [`word_w]user_ram[`word_d]  ; QuartusII会自动综合成为一个ram—— 当然有一些前提:(后续补充 ...

  10. iOS开发之计算动态cell的高度并缓存

    项目中有个类似微博那样的动态cell,文字和图片的多少都不是确定的 刚开始使用autolayout,结果很多问题,最后我发现了一个框架 FDTemplateLayoutCell 写的很好,自动布局ce ...