C语言,变长数组的用法
在我的《C语言,结构体成员的地址》文章中,定义了一个demo_node结构体,其中用到变长数组char addr[0]。本文以此为例,对C语言变长数组的基本用法展开介绍。
typedef struct _demo_node_{
struct _demo_node_* pprenode;
struct _demo_node_* pnextnode;
unsigned long member_num;
unsigned short age;
char addr[0];
}demo_node;
1、变长数组的定义
变长数组是指用整型变量或表达式声明或定义的数组,它的长度为0,这个数组本身并不占空间。
printf("sizeof(struct _demo_node_*) = %d\n",sizeof(struct _demo_node_*));
printf("sizeof(unsigned long) = %d\n",sizeof(unsigned long));
printf("sizeof(unsigned short) = %d\n",sizeof(unsigned short));
printf("sizeof(demo_node) = %d\n",sizeof(demo_node));
输出结果为
sizeof(struct _demo_node_*) = 8
sizeof(unsigned long) = 4
sizeof(unsigned short) = 2
sizeof(demo_node) = 24
分析可知,addr[0] 占用的空间为:24 - (8+8+4+2) = 0,验证了前面的说法。
2、变长数组的作用
满足需要变长度的结构体,让结构体的拓展变得十分灵活。
3、变长数组的用法
- 放在一个结构体的最后 ,申明一个长度为空的数组
- 变长数组名仅仅是一个符号,它不会占用任何空间,它在结构体中,只是代表了一个偏移量,是不可修改的地址常量。
下面看示例,可以直观的看出用法。
#include <stdio.h>
#include <malloc.h>
#include <string.h>
typedef struct _demo_node_{
struct _demo_node_* pprenode;
struct _demo_node_* pnextnode;
unsigned long member_num;
unsigned short age;
char addr[0];
}demo_node;
typedef struct {
char province[8];
char city[8];
}address_info;
int main(void)
{
demo_node* person = NULL;
// 为demo_node结构体和address_info结构体分配内存
person = (demo_node*)malloc(sizeof(demo_node)+sizeof(address_info));
if(NULL == person)
{
printf("malloc demo_node failed\n\r");
return -1;
}
// person->addr是malloc分配的address_info内存的地址
address_info* personA_addr = NULL;
personA_addr = (void*)&(person->addr);
strcpy(personA_addr->province, "台湾");
strcpy(personA_addr->city, "台北");
address_info* personB_addr = NULL;
personB_addr = (void*)&(person->addr);
printf("personB的省份:%s\n",personB_addr->province);
printf("personB的城市:%s\n", personB_addr->city);
printf("person->addr的地址 = 0x%0x\n", &(person->addr));
printf("personB_addr->province的地址 = 0x%0x\n", &(personB_addr->province));
printf("personB_addr->city的地址 = 0x%0x\n", &(personB_addr->city));
free(person);
return 0;
}
输出的结果为
personB的省份:台湾
personB的城市:台北
person->addr的地址 = 0x1d6f36
personB_addr->province的地址 = 0x1d6f36
personB_addr->city的地址 = 0x1d6f3e
本文的变长数组 addr[0],指向的是一个固定的结构体,相当于对demo_node结构体做了一个拓展。
其实变长数组还常用于网络通信中构造不定长的数据包,使用时,可根据数据的长度动态的开辟数据缓冲区,避免造成不必要的流量浪费。
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 ...
- c语言,变长数组
下面这个结构体,可以在malloc的时候指定数据data的长度,这样的形式就是变长数组:typedef struct{ int data_len; char data[0];//或char data[ ...
- 《OOC》笔记(3)——C语言变长参数va_list的用法
<OOC>笔记(3)——C语言变长参数va_list的用法 C语言中赫赫有名的printf函数,能够接受的参数数目不固定,这就是变长参数.C#里也有params这个关键字用来实现变长参数. ...
- 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 ...
随机推荐
- 在Windows 版的Chrome中切换标签页
按住Ctrl+tab键之后使用page up/ page down键左右移动!
- java - 局部变量和成员变量的区别
package class_object; /** * 局部变量和成员变量的区别 * * 1. 定义位置 * * 2. 作用域 * * 3. 默认值 => 局部变量没有默认值 * * 4. 内存 ...
- JMS微服务架构 - 关于事务提交失败,自动重新提交的机制
用JMS编写的微服务,由调用端决定了各个微服务执行时,是否需要保持事务的一致性. 也就是RemoteClient在调用微服务方法前,先调用BeginTransaction明确后面所调用的微服务需要保持 ...
- [转帖]Nginx 安全优化
目录 前言 1.使用 SSL/TLS 证书 2.使用安全密钥交换机制 3.禁用旧的 SSL/TLS 协议 4.禁用 SSL/TLS 弱密码套件 5.禁用不需要的 HTTP 方法 6.防止缓冲区溢出攻击 ...
- 阿里云ECS自建K8S_IPV6重启后异常问题解决过程
阿里云ECS自建K8S_IPV6重启后异常问题解决过程 背景 最近安装了一个单节点的K8S_IPV6 昨天不知道何故 突然宕机了. 然后只能在阿里云的控制台后台重启了ECS 启动之后看K8S的状态一开 ...
- [1036]kvm虚拟机访问时提示no route to host分析
环境 宿主机: IP: 10.110.136.43 版本:Kylin Linux Advanced Server release V10 (Sword) KVM vm: IP: 10.110.136. ...
- Oracle 提示 用户在线,无法删除的清理方法
查找删除策略. select username,sid,serial# from v$session where username='FSSCDEC004'; alter system kill se ...
- 从DevOps状态报告看技术团队的文化建设
本文源自一次内部分享,借由此机会又把历年的DevOps状态报告翻看了一遍,其实大多数时候我们对于DevOps的理解都在于流程,工具,实践这些看得见摸得着的东西,但就像文末的几点思考所说的那样,我们一直 ...
- 小白学k8s(3)什么是内网穿透
什么是内网穿透 内网穿透 工作方式 通信的一方处于内网 通信的双方都处于内网 NAT穿透的原理 UDP内网穿透的实现流程 参考 什么是内网穿透 内网穿透 什么是内网穿透呢? 百度百科的描述 内网穿透, ...
- 【踩坑记录】SpringBoot跨域配置不生效
问题复现: 明明在拦截器里配置了跨域,就是不生效,使用PostMan等后端调试工具调试,均正常,Response中有Access-Control-Allow-Origin: *,这个Header,但是 ...