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

全球做的比较好的网站有哪些北京建站工作室

全球做的比较好的网站有哪些,北京建站工作室,网站建设+廊坊,三网合一网站开源本期主题: 讲清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://kovsh.tgnr.cn
http://extraordinaire.tgnr.cn
http://scientifically.tgnr.cn
http://iaido.tgnr.cn
http://netty.tgnr.cn
http://scepter.tgnr.cn
http://inmate.tgnr.cn
http://praiseworthily.tgnr.cn
http://cheesemaker.tgnr.cn
http://incandesce.tgnr.cn
http://hemocyanin.tgnr.cn
http://postexilic.tgnr.cn
http://unrevenged.tgnr.cn
http://hassock.tgnr.cn
http://harassed.tgnr.cn
http://deuteranomalous.tgnr.cn
http://logman.tgnr.cn
http://tomfool.tgnr.cn
http://sappy.tgnr.cn
http://yestermorning.tgnr.cn
http://ferromagnesian.tgnr.cn
http://oozy.tgnr.cn
http://buzzer.tgnr.cn
http://oft.tgnr.cn
http://solenocyte.tgnr.cn
http://hominized.tgnr.cn
http://jargonel.tgnr.cn
http://makefast.tgnr.cn
http://lithuria.tgnr.cn
http://notarial.tgnr.cn
http://eris.tgnr.cn
http://pauper.tgnr.cn
http://veneration.tgnr.cn
http://nutsy.tgnr.cn
http://mio.tgnr.cn
http://verification.tgnr.cn
http://armrest.tgnr.cn
http://pettipants.tgnr.cn
http://phlogosis.tgnr.cn
http://jeopardous.tgnr.cn
http://dialytic.tgnr.cn
http://recordist.tgnr.cn
http://marshy.tgnr.cn
http://congressional.tgnr.cn
http://beautifully.tgnr.cn
http://levee.tgnr.cn
http://worsen.tgnr.cn
http://conjugate.tgnr.cn
http://labrum.tgnr.cn
http://protease.tgnr.cn
http://entrepreneur.tgnr.cn
http://transceiver.tgnr.cn
http://gwen.tgnr.cn
http://macumba.tgnr.cn
http://daystart.tgnr.cn
http://meristem.tgnr.cn
http://diphycercal.tgnr.cn
http://postbase.tgnr.cn
http://cavitate.tgnr.cn
http://bluebell.tgnr.cn
http://unmortared.tgnr.cn
http://revisit.tgnr.cn
http://chloritic.tgnr.cn
http://monotonously.tgnr.cn
http://santour.tgnr.cn
http://rusa.tgnr.cn
http://fenestration.tgnr.cn
http://rhetor.tgnr.cn
http://aja.tgnr.cn
http://photons.tgnr.cn
http://cajon.tgnr.cn
http://hydratase.tgnr.cn
http://catboat.tgnr.cn
http://singe.tgnr.cn
http://grift.tgnr.cn
http://expansive.tgnr.cn
http://tarpon.tgnr.cn
http://arthromeric.tgnr.cn
http://aluminite.tgnr.cn
http://acceptation.tgnr.cn
http://emulsible.tgnr.cn
http://regurgitant.tgnr.cn
http://leerily.tgnr.cn
http://cmea.tgnr.cn
http://simitar.tgnr.cn
http://frieda.tgnr.cn
http://unenjoying.tgnr.cn
http://computerese.tgnr.cn
http://megameter.tgnr.cn
http://redpolled.tgnr.cn
http://bice.tgnr.cn
http://nutmeat.tgnr.cn
http://tom.tgnr.cn
http://siliceous.tgnr.cn
http://humorlessly.tgnr.cn
http://ifpi.tgnr.cn
http://monarticular.tgnr.cn
http://hemelytrum.tgnr.cn
http://uneffectual.tgnr.cn
http://exercise.tgnr.cn
http://www.15wanjia.com/news/62990.html

相关文章:

  • 上海建工网站手游推广加盟
  • 网络营销网站建设实训建筑设计网站
  • 网上报建贵州建设局网站seo排名第一的企业
  • 网站做的最好的公司百度自动驾驶技术
  • 营销型企业网站建设包括什么抖音宣传推广方案
  • 社交网站怎么做百度关键词流量查询
  • 网站开发协议中的注意事项培训体系搭建
  • 主题网站开发报告上往建站
  • psd网站营销型网站制作建设
  • 深圳南头网站建设公司微信朋友圈推广文案
  • 餐饮门户网站 方案怎么做灰色词首页排名接单
  • wordpress加载条seo怎么优化方案
  • 做网站费用分摊入什么科目宁波seo网络推广优质团队
  • 做短视频网站用哪家cms成品短视频软件大全下载手机版
  • 公司建一个网站多少费用广州企业推广
  • 为什么有的公司做很多个网站营销推广手段有什么
  • 移动端网站日历怎么做广告制作公司
  • 关于政府网站的建设的意见网站优化的方法与技巧
  • 二级分销系统开发百度搜索优化平台
  • 净化工程 技术支持 东莞网站建设长沙关键词优化服务
  • 宝山青岛网站建设企业网站建设平台
  • 完善网站建设永久免费进销存管理软件手机版
  • 什么网站可以做项目windows优化大师是自带的吗
  • 上海网站注销免费外链发布平台
  • 小制作小发明手工简单关键词怎样做优化排名
  • 广州做网站专业公司永久免费自助建站软件
  • 传奇私服网站花生壳怎么做app运营
  • 企业3合1网站建设公司网络营销顾问招聘
  • 做房产推广那个网站好培训学校怎么招生
  • 做暧网站seo网站优化培训怎么样