c语言,变长数组
下面这个结构体,可以在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语言,变长数组的更多相关文章
- C语言变长数组 struct中char data[0]的用法
版权声明:本文为博主原创文章,未经博主允许不得转载. 今天在看一段代码时出现了用结构体实现变长数组的写法,一开始因为忘记了这种技术,所以老觉得作者的源码有误,最后经过我深思之后,终于想起以前看过的用s ...
- C语言变长数组data[0]总结
C语言变长数组data[0] 1.前言 今天在看代码中遇到一个结构中包含char data[0],第一次见到时感觉很奇怪,数组的长度怎么可以为零呢?于是上网搜索一下这样的用法的目的,发现在linux内 ...
- C语言变长数组data[0]
1.前言 在刷题时遇到一个结构中包含char data[0],第一次见到时感觉很奇怪,数组的长度怎么可以为零呢?于是上网搜索一下这样的用法的目的,发现在linux内核中,结构体中经常用到data[0] ...
- C语言变长数组data[0]【总结】
1.前言 今天在看代码中遇到一个结构中包含char data[0],第一次见到时感觉很奇怪,数组的长度怎么可以为零呢?于是上网搜索一下这样的用法的目的,发现在linux内核中,结构体中经常用到data ...
- C语言变长数组
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct Variable ...
- GCC 中零长数组与变长数组
前两天看程序,发现在某个函数中有下面这段程序: int n; //define a variable n int array[n]; //define an array with length n 在 ...
- C++内存分配及变长数组的动态分配
//------------------------------------------------------------------------------------------------ 第 ...
- PL/SQL 嵌套表变长数组和索引表[转]
关于PL/SQL中这三种数组的介绍,不想写了.转一篇日志吧…… 链接:http://www.blogjava.net/decode360/archive/2008/08/08/280825.html ...
- 《OOC》笔记(3)——C语言变长参数va_list的用法
<OOC>笔记(3)——C语言变长参数va_list的用法 C语言中赫赫有名的printf函数,能够接受的参数数目不固定,这就是变长参数.C#里也有params这个关键字用来实现变长参数. ...
随机推荐
- Android 学习开发笔记《Android认识》
1. Android:2007年11月5日第一版,2009年5月豪华版,2010年HTC手机 2. Android框架主要:应用程序.应用程序框架.函数库.运行时. ...
- js基本框架
- CSS3 transform制作的漂亮的滚动式导航
模拟这个做的 不过实现的没有别人那么好 http://www.creativetier.com/products/modern-menu-3/vertical.html 关于transform 看这 ...
- Matlab近期用到的函数(持续更新)
最近任务用到matlab较多,第一版的代码大部分对于矩阵类的计算都是用for循环来完成的,主要是思维还没有适应matlab.看了同事的一份代码后,现在遇到需要循环的地方第一反应就是如何能够用矩阵的直接 ...
- FluentConsole是一个托管在github的C#开源组件
FluentConsole是一个托管在github的C#开源组件 阅读目录 1.控制台能有啥滑头? 2.FluentConsole基本介绍 3.使用介绍 4.资源 从该系列的第一篇文章 .NET平台开 ...
- Unable to connect to your virtual device!解决方法
使用Genymotion安卓模拟器的用户,很多朋友在启动安卓系统的时候就弹出了以下英文,不知道如何处理,今天电脑知识网小编来教您处理Genymotion安卓模拟器启动出错的问题. Error Unab ...
- 基于visual Studio2013解决C语言竞赛题之0306分数转换
题目 解决代码及点评 根据题目要去,我们可以通过if实现该功能,伪代码如下: if(a > 90) print 'A' else if(a>80) print 'b' else ...
- Hdu 2364 Escape
Problem地址:http://acm.hdu.edu.cn/showproblem.php?pid=2364 这道题的特殊之处在于能转弯时不能直走,必须转弯,所以在行走时,要判断能否转弯,不能转弯 ...
- UVA 1619 Feel Good(DP)
Bill is developing a new mathematical theory for human emotions. His recent investigations are dedic ...
- 【Hibernate】Remember that ordinal parameters are 1-based!
此错误的官方解释:1.当hql中不需要参数,而传递了参数导致,2.set参数时没有从0开始. 但此问题不属这两种. 检查导入的libraries无错误. 最后在网络搜索到:http://qihaihu ...