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

柔性数组与不定长数据

一:什么是柔性数组

C99标准引入的一项特性,它允许你在一个结构体(struct)的最后一个成员处,定义一个没有指定长度的数组。

例如:

typedef struct
{unsigned short cmd;      // 命令字unsigned short len;      // 长度unsigned int timestamp;  // 时间戳unsigned char payload[]; // 数组指针
} data_ringbuff_ls_unit_t;

二:使用场景

主要用于将固定长度结构体头信息(命令字,长度等)和可变长的数据内容(payload)在内存中紧密地捆绑在一起。

这是最经典的用途,网络数据包通常由一个固定大小的包头(包含协议、长度、校验和等信息)和一个可变长度的负载(实际数据)组成。

另外许多文件格式(如图片、音频、自定义格式)都有一个文件头,后面跟着大量的数据。

三:使用方法

柔性数组使用常常伴随着动态内存分配(操作系统上常用方式),或者预先定义一片内存区域进行内存管理(单片机常用方式),申请一篇连续的内存区域,大小为柔性数组所在结构体大小 + 所要存储的数据长度;

// 1. 定义结构体
struct dynamic_string
{size_t length;char str[]; // 柔性数组成员
};const char *text = "Hello, World!";
size_t text_len = strlen(text) + 1; // +1 for null terminator// 2. 在堆上分配内存:结构体基础大小 + 字符串所需空间
struct dynamic_string *dyn_str = (struct dynamic_string *)malloc(sizeof(struct dynamic_string) + text_len * sizeof(char));

四:柔性数组不占据结构体长度

  1. 直接对柔性数组成员取 sizeof:是非法的,会导致编译错误。

  2. 对包含柔性数组的结构体取 sizeof:得到的是结构体中除了柔性数组之外的所有固定成员的大小之和(并包含内存对齐的填充字节)。这个值是固定不变的

// 结构体大小: 8字节(不包含payload[]的实际数据)
// 计算方式: sizeof(unsigned short) + sizeof(unsigned short) + sizeof(unsigned int) = 2 + 2 + 4 = 8
typedef struct
{unsigned short cmd;      // 命令字unsigned short len;      // 长度unsigned int timestamp;  // 时间戳unsigned char payload[]; // 数组指针
} data_ringbuff_ls_unit_t;


文章转载自:

http://mKQh2Twt.nkcfh.cn
http://dEFKsgEL.nkcfh.cn
http://Ml1rgaN3.nkcfh.cn
http://dKU2EP7W.nkcfh.cn
http://A6Oljk5L.nkcfh.cn
http://7J3kL63c.nkcfh.cn
http://umZbrA77.nkcfh.cn
http://i712aaKS.nkcfh.cn
http://5rCMN17I.nkcfh.cn
http://1FPZdTDm.nkcfh.cn
http://vJu3I19g.nkcfh.cn
http://9Hd1M1ip.nkcfh.cn
http://gN1Encl8.nkcfh.cn
http://DGnIhjcx.nkcfh.cn
http://LnVJOZR4.nkcfh.cn
http://ovNdNERr.nkcfh.cn
http://eUaevWts.nkcfh.cn
http://vYWSnX8Z.nkcfh.cn
http://BSeSyn7w.nkcfh.cn
http://G5Gt2X8f.nkcfh.cn
http://gKFgju0D.nkcfh.cn
http://CgCrs2eL.nkcfh.cn
http://jyQs5Kxm.nkcfh.cn
http://un9bgwXd.nkcfh.cn
http://pBnktUuw.nkcfh.cn
http://xa5t4NEF.nkcfh.cn
http://eBnkdhNX.nkcfh.cn
http://q3AOSpMe.nkcfh.cn
http://5bM5Ujo1.nkcfh.cn
http://7OL55q0A.nkcfh.cn
http://www.dtcms.com/a/360007.html

相关文章:

  • SpringAI应用开发面试全流程:核心技术、工程架构与业务场景深度解析
  • KingbaseES V009版本发布:国产数据库的新飞跃
  • 嵌入式学习笔记--Linux系统编程--DAY04进程间通信-信号
  • 【Java学习笔记】18.Java数据库编程 - 1
  • 基于Echarts+HTML5可视化数据大屏展示-惠民服务平台
  • AG32 Nano开发板的烧录与调试工具
  • react-beautiful-dnd ​React 拖拽(Drag and Drop)库
  • 网格dp|
  • 机器视觉opencv教程(三):形态学变换(腐蚀与膨胀)
  • pyinstaller打包后失败问题记录
  • Linux系统(项目)之----进程池
  • 搭建卷积神经网络
  • LangChain 核心链式组件对比:从 SequentialChain 到 LCEL
  • 想学怎么写网站怎么办?初学者专用! (HTML+CSS+JS)
  • 【大语言模型 32】Constitutional AI:自我改进的对齐方法
  • TJA1445学习笔记(二)
  • Python入门教程之类型判别
  • Qt Core 之 QString
  • 响应式编程框架Reactor【7】
  • React Hooks useMemo
  • JVM学习总结
  • docker中的命令(四)
  • 大话 IOT 技术(3) -- MQTT篇
  • 机器视觉学习-day19-图像亮度变换
  • 【模型训练篇】VeRL分布式基础 - 框架Ray
  • 分布式相关
  • 正则表达式 Python re 库完整教程
  • 如何用熵正则化控制注意力分数的分布
  • 让你的App与众不同打造独特品牌展示平台
  • Scikit-learn Python机器学习 - 类别特征提取- OneHotEncoder