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

【Linux C小技巧】零长度数组的使用

本期主题:
讲清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:零长度数组

相关文章:

【Linux C小技巧】零长度数组的使用

本期主题&#xff1a; 讲清Linux C的零长度数组使用&#xff0c;内容包括&#xff1a; 零长度数组是什么原理为什么要使用零长度数组与指针的差异 往期链接&#xff1a; 数据结构系列——先进先出队列queue数据结构系列——栈 stackLinux内核链表 目录 0.前言1.零长度数组原理…...

github 网页显示不全?

问题 解决 1、检查网页&#xff0c;打开 network&#xff0c;重新刷新 github 网页 2、查看无法加载的资源&#xff08;如 css 文件&#xff09; 3、查看域名地址 https://tool.chinaz.com/dns/&#xff0c;github.githubassets.com&#xff08;检查网页元素&#xff0c;点击无…...

寄存器介绍

目录 寄存器的概念 寄存器工作原理 寄存器的状态 查看寄存器信息 寄存器复位 大空间寄存器复位 寄存器的概念 寄存器是计算机中一种临时存储数据的硬件设备&#xff0c;通常是高速缓存的一部分&#xff0c;用于存储、读取和操作计算机内部的数据。它们是计算机中最快的存…...

基于CNN-LSTM的时序预测MATLAB实战

一、算法原理 1.1 CNN原理 卷积神经网络具有局部连接、权值共享和空间相关等特性。卷积神经网络结构包含卷积层、激活层和池化层。 &#xff08;a&#xff09;二维卷积层将滑动卷积滤波器应用于输入。该层通过沿输入垂直和水平方向 移动滤波器对输入进行卷积&#xff0c;并计…...

MySQL高可用九种方案

有的时候博客内容会有变动&#xff0c;首发博客是最新的&#xff0c;其他博客地址可能会未同步,认准https://blog.zysicyj.top 首发博客地址[1] 参考视频[2] MMM 方案&#xff08;单主&#xff09; MySQL 高可用方案之 MMM&#xff08;Multi-Master Replication Manager&#x…...

react 通过ref 获取对应 dom 的位置信息

需求&#xff1a; 在点击某个dom 元素的时候滚动条要同步滚动 进程&#xff1a; 获取ref 打印&#xff0c;打印出来是一个dom 元素&#xff0c;看不到有什么方法查找 dom 属性信息找到了两个参数&#xff0c;offsetLeft&#xff1a;返回元素的水平偏移位置。 offsetTop&…...

SpringSecurity学习 - 认证和授权

一般来说中大型的项目都是使用SpringSecurity 来做安全框架。小项目有Shiro的比较多&#xff0c;因为相比与SpringSecurity&#xff0c;Shiro的上手更加的简单。 一般Web应用的需要进行认证和授权。 认证&#xff1a;验证当前访问系统的是不是本系统的用户&#xff0c;并且要…...

JDK jps命令复习

之前写过jdk命令工具的博文&#xff0c;下面复习jps命令&#xff1b; jps 是 Java Process Status Tool 的简称,它的作用是为了列出所有正在运行中的 Java 虚拟机进程和相关信息&#xff1b; jps 命令参数 -q 只输出进程 ID,省略主类的名称 -m 输出虚拟机进程启动时传递…...

Android 13.0 屏蔽Launcher3桌面app图标的长按功能

1.概述 在13.0的产品定制化开发中,系统默认的Launcher3在workspace 第二屏通常都会显示app列表 点击进入app 列表页,长按app的icon图标会弹出 应用信息 弹窗 等信息,而产品的开发需要,不需要弹出这些信息,所以要求去掉app的icon图标的长按功能 2.屏蔽Launcher3桌面app图…...

软考和PMP哪个含金量更高?

软考中&#xff0c;能和pmp一起来比较的是软考高项&#xff0c;软考高级信息系统项目管理师&#xff0c;和PMP的共同点&#xff0c;基本来说都是项目管理类的证书。本质也都是适用于项目经理岗位的证书&#xff0c;软考高项中大部分考试内容是PMPIT技术两部分&#xff0c;其中项…...

第一章:最新版零基础学习 PYTHON 教程(第三节 - 下载并安装Python最新版本)

在这里&#xff0c;我们将讨论如何获得与在 Windows/Linux/mac OS 上安装 Python 相关的所有问题的答案。Python由Guido van Rossum于20世纪90年代初开发&#xff0c;最新版本为3.11&#xff0c;我们可以简称为Python3。 如何下载并安装Python&#xff1f; 要了解如何安装 P…...

Spring 中三种 BeanName 生成器!

无论我们是通过 XML 文件&#xff0c;还是 Java 代码&#xff0c;亦或是包扫描的方式去注册 Bean&#xff0c;都可以不设置 BeanName&#xff0c;而 Spring 均会为之提供默认的 beanName&#xff0c;今天我们就来看看 Spring 中三种处理不同情况的 beanName 生成器。 1. BeanN…...

Go基础-文件、字符

文件创建 导入“os”包&#xff0c;创建文件&#xff0c;读写文件的函数都在改包。 指定创建的文件存放路径以及文件名。 执行Create( )函数&#xff0c;进行文件创建。 关闭文件。 package mainimport ("fmt""os" )func main() {//创建文件&#xff0c;…...

启动YOLO进行图片物体识别

查看官方文档YOLO: Real-Time Object Detection 这些是一些模型的对比&#xff0c;显示了YOLO的优势&#xff0c;继续往下面看 CoCoData set 是一个数据库&#xff0c;用来训练模型&#xff0c;这里面有丰富的物体检测&#xff0c;分割数据集&#xff0c;图像经过了精确的segm…...

BMS电池管理系统的蓝牙芯片 国产高性能 低功耗蓝牙Soc芯片PHY6222

电池管理系统是对电池进行监控与控制的系统&#xff0c;将采集的电池信息实时反馈给用户&#xff0c;同时根据采集的信息调节参数&#xff0c;充分发挥电池的性能。但是&#xff0c;前技术中&#xff0c;在管理多个电池时&#xff0c;需要人员现场调试与设置&#xff0c;导致其…...

肖sir__mysql之三表__008

mysql之三表 create table student( stu_no int, stu_name varchar(10), sex char(1), age int(3), edit varchar(20) ) DEFAULT charsetutf8; insert into student values (1,‘wang’,‘男’,21,‘hello’), (2,‘小明’,‘女’,22,‘haha2’), (3,‘hu’,‘女’,23,‘haha3…...

【Linux】常用工具(上)

Linux 常用工具 一、Linux 软件包管理器 yum1. 软件包2. 查看软件包3. 安装/卸载软件4. yum 其他指令的功能 二、Linux 编辑器 - vim 使用1. vim 的基本概念2. vim 的基本操作&#xff08;1&#xff09;光标移动&#xff08;命令模式&#xff09;&#xff08;2&#xff09;光标…...

【kafka】可视化工具KAFKA EAGLE安装分享

目录 准备&#xff1a; 开始&#xff1a; 1.解压 2.环境变量配置 3.生效环境变量配置文件 3.修改配置文件 1.修改zookeeper集群信息 2.修改mysql配置信息 4.启动 5.异常排查 6.页面 创作不易&#xff0c;你的动力是我创作的动力&#xff0c;如果有帮助请关注我&…...

【深度装机】深度U盘装机后黑屏闪光标

装x64的系统 装机版的gho文件太多预装软件了。几年前买的这种无风扇的机器&#xff0c;之前装的ubuntu&#xff1a;装机U盘启动后&#xff0c;先删掉的所有的ubuntu分区。使用了10几年的AOC又肩负使命&#xff1a; 感觉发热还是挺大的。 有人说因为secure boot 打开secure boo…...

【性能测试】JMeter:集合点,同步定时器的应用实例!

一、集合点的定义 在性能测试过程中&#xff0c;为了真实模拟多个用户同时进行操作以度量服务器的处理能力&#xff0c;可以考虑同步虚拟用户以便恰好在同一时刻执行操作或发送请求。 通过插入集合点可以较真实模拟多个用户并发操作。 (注意&#xff1a;虽然通过加入集合点可…...

告别ET1100?聊聊AX58100这颗高性价比EtherCAT从站芯片的升级体验

告别ET1100&#xff1f;AX58100高性价比EtherCAT从站芯片的工业升级实战 当工业设备制造商面临从传统控制架构向实时以太网迁移时&#xff0c;EtherCAT从站芯片的选型往往成为关键转折点。十年前&#xff0c;ET1100凭借其稳定的性能和相对友好的开发门槛&#xff0c;成为许多工…...

如何3步免费解锁WeMod专业版:2026年终极增强工具使用指南

如何3步免费解锁WeMod专业版&#xff1a;2026年终极增强工具使用指南 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/gh_mirrors/we/Wand-Enhancer 还在为WeMod专业版的订阅费用而犹豫…...

抖音批量下载神器:5分钟学会免费高效下载视频、音乐和直播

抖音批量下载神器&#xff1a;5分钟学会免费高效下载视频、音乐和直播 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback s…...

防火门安装与验收要点|闭门器、密封条、顺序器缺一不可

防火门安装与验收要点一、必备配件&#xff08;缺一不可&#xff09;闭门器&#xff1a;自动关门&#xff0c;火灾常态闭合防火密封条&#xff1a;遇火膨胀&#xff0c;隔烟阻火顺序器&#xff1a;双扇门专用&#xff0c;保证先后闭合二、安装要点门框墙体嵌实牢固&#xff0c;…...

开源银行API模拟器Bankr Buddy:金融科技开发的本地化测试解决方案

1. 项目概述&#xff1a;一个为开发者准备的银行API模拟器如果你正在开发一个需要与银行账户数据打交道的应用&#xff0c;无论是个人财务管理工具、预算分析软件&#xff0c;还是企业级的财务聚合服务&#xff0c;你肯定遇到过同一个难题&#xff1a;如何在不触碰真实用户敏感…...

从XTR文件看GNSS数据质量:如何利用Anubis报告优化你的测量方案(以GPS/BDS/Galileo为例)

从XTR文件解码GNSS数据质量&#xff1a;实战分析与优化策略 在GNSS测量领域&#xff0c;数据质量直接决定了最终定位结果的可靠性。XTR文件作为Anubis软件生成的质量报告&#xff0c;包含了大量反映GNSS观测质量的指标参数。对于有经验的工程师而言&#xff0c;这些数字不仅仅是…...

构建个人知识库:从碎片化代码到结构化知识体系

1. 项目概述&#xff1a;从“ClawCode”看个人知识库的构建与价值最近在和一些开发者朋友交流时&#xff0c;发现一个普遍现象&#xff1a;大家电脑里都散落着无数代码片段、配置脚本、临时笔记和项目心得。这些“数字碎片”价值巨大&#xff0c;但往往因为缺乏有效的组织&…...

基于MCP协议构建AI编程助手:unloop-mcp文件系统服务器实战指南

1. 项目概述&#xff1a;一个面向开发者的“解循环”MCP服务器最近在GitHub上看到一个挺有意思的项目&#xff0c;叫Escapepaleolithic247/unloop-mcp。光看这个名字&#xff0c;可能有点摸不着头脑&#xff0c;但如果你是一个经常和AI助手&#xff08;比如Claude、Cursor等&am…...

如何在Windows 11上让经典游戏重获新生:DDrawCompat兼容性解决方案详解

如何在Windows 11上让经典游戏重获新生&#xff1a;DDrawCompat兼容性解决方案详解 【免费下载链接】DDrawCompat DirectDraw and Direct3D 1-7 compatibility, performance and visual enhancements for Windows Vista, 7, 8, 10 and 11 项目地址: https://gitcode.com/gh_m…...

ESP32接入ChatGPT API:构建本地化AIoT智能交互终端

1. 项目概述&#xff1a;当ESP32遇见ChatGPT&#xff0c;开启本地化智能交互新玩法最近在捣鼓ESP32开发板&#xff0c;总想着给它加点“智能”的料。传统的物联网项目&#xff0c;比如温湿度监测、远程控制开关&#xff0c;虽然实用&#xff0c;但总觉得少了点“灵魂”。直到我…...