当前位置: 首页 > news >正文

网站建设包含以下哪些建设阶段绍兴市越城区建设局网站

网站建设包含以下哪些建设阶段,绍兴市越城区建设局网站,jsp做网站 案例,装修贷本期主题: 讲清Linux C的零长度数组使用,内容包括: 零长度数组是什么原理为什么要使用零长度数组与指针的差异 往期链接: 数据结构系列——先进先出队列queue数据结构系列——栈 stackLinux内核链表 目录 0.前言1.零长度数组原理…

本期主题:
讲清Linux C的零长度数组使用,内容包括:

  1. 零长度数组是什么原理
  2. 为什么要使用零长度数组
  3. 与指针的差异

往期链接:

  • 数据结构系列——先进先出队列queue
  • 数据结构系列——栈 stack
  • Linux内核链表

目录

  • 0.前言
  • 1.零长度数组原理
  • 2.零长度数组特点1:不占空间
  • 3.零长度数组特点2:分配的空间可以连续


0.前言

有时候我们在看代码时,会有这种结构体,定义了一个数组长度为0的数组,如下面代码,我初次看见时非常疑惑,那么零长度数组的意义是什么呢?

typedef struct {int a;uint8_t c[0];
} test_a;

1.零长度数组原理

  1. 长度为0的数组在标准c和c++中是不允许的,如果使用长度为0的数组,编译时会产生错误,提示数组长度不能为0
  2. 但在GNU C中,这种用法却是合法的。它的最典型的用法就是位于数组中的最后一项,如上面所示,这样做主要是为了方便内存缓冲区的管理

2.零长度数组特点1:不占空间

看下面这段代码:设计一个包含零长度数组的结构体test_a,还有一个包含指针的结构体test_c

#include <stdio.h>
#include <stdint.h>
#include <string.h>typedef struct {int a;uint8_t c[0];
} test_a;typedef struct {int b;
} test_b;/*这里使用packed,是因为我编译环境是64位*如果不用packed,担心影响大家判断*/
typedef struct {int 	c;uint8_t *ptr;
} __attribute__ ((packed)) test_c;int main(void)
{test_a a;test_b b;test_c c;printf("sizeof test_a: %ld, sizeof test_b: %ld, sizeof test_c: %ld\n",sizeof(a), sizeof(b), sizeof(c));return 0;
}

测试结果:

$ ./a.out
sizeof test_a: 4, sizeof test_b: 4, sizeof test_c: 12

结论:

可以看出,零长度数组是不占用空间的,这是它优于指针的一个点

3.零长度数组特点2:分配的空间可以连续

设想一个这样的场景,需要设计发送消息的代码,消息包括消息头和payload字段,有两种设计方式:

typedef struct {msg_head_t msg_head;uint8_t    data[0];
} msg_t;typedef struct {msg_head_t msg_head;uint8_t    *data;
} msg_t;

你觉得哪种更好?

从底层发送接口的角度来考虑,设计函数时,有一个消息的整体指针作为入参就可以了,所以当然是第一种数据连续的底层更好适配。这是零长度数组的第二个特点,比指针更为灵活,空间连续
看测试代码:

#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <stdlib.h>typedef struct _msg_a {int 	len;uint8_t data[0];
} msg_a_t;typedef struct _msg_b {int 	len;uint8_t *data;
} msg_b_t;int main(void)
{int data_len = 10;msg_a_t *ptr_msg_a = (msg_a_t *)malloc(sizeof(msg_a_t) + data_len);msg_b_t *ptr_msg_b = (msg_b_t *)malloc(sizeof(msg_b_t));ptr_msg_b->data = malloc(data_len);printf("a: %p, a_data: %p, b: %p, b_data: %p\n",ptr_msg_a, ptr_msg_a->data, ptr_msg_b, ptr_msg_b->data);return 0;
}

结果:

$ ./a.out
a: 0x560958fb1260, a_data: 0x560958fb1264, b: 0x560958fb1280, b_data: 0x560958fb12a0

能看出零长度数组确实是连续空间,符合预期。

参考自 嵌入式C语言自我修养 05:零长度数组

http://www.yayakq.cn/news/798898/

相关文章:

  • 安徽网站优化建设wordpress输出标签文章
  • 建设工程竣工规划局网站网络虚拟号
  • 企业网站建设需要提供什么内容数据网站开发
  • 自己建一个网站难吗济南网站制作网站
  • 模板网站外贸建站黄冈网站优化公司哪家好
  • 做app和网站wap网站域名申请
  • 建立网站一般那些阶段会展设计
  • 怎么让别人找你做网站优化方案化学
  • 找人做网站排名免费网页设计成品
  • 测字算命网站开发wordpress 二级域名
  • 网站问题有哪些内容做网站的公司cnfg
  • 找外包公司做网站给我一个可以在线观看片
  • 建网站莱阳哪家强?学网站建设需要学多久
  • 搞笑网站建设目的和意义郑州哪里可以做网站
  • 网站搭建设计课程报告wordpress主题透明
  • 做网站需要的资料青岛外贸建设网站
  • 如何将软件上传到公开网站南阳网站建设xihewh
  • 网站建设推广合同范本网络舆情分析师
  • 企业手机网站源码百度一下你就知道网页
  • 网站建设报告 商业价值智慧团手机网上登录入口
  • 计算机专业论文 网站建设大一网页设计代码英语
  • 乐清网站制作推广wordpress要用什么代码
  • 南昌网站开发培训学校聊城市住房和城乡建设局网站首页
  • 贵州建设厅造价信息网站百度小说风云榜今天
  • 档案网站建设愿景百度网站入口
  • 在凡科网申请的网站设置网页访问密码系统官网网站模板
  • 南京建站公司模板如何做一份企业网站规划
  • 东莞企业型网站建设写好网页怎么建成网站
  • 照片制作网站优化对企业有什么好处
  • 秦皇岛市 网站建设网站公司的利润在哪里