当前位置: 首页 > 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://www.xdnf.cn/news/1411651.html

相关文章:

  • 【秋招笔试】2025.08.31饿了么秋招笔试题
  • SPMTE 2022概述
  • 线程池常见面试问答
  • 一次解决 Elasticsearch 两大难题: 掌握去重和深分页的最佳实践
  • Day19_【机器学习—线性回归 (1)】
  • PerfectSquares.java
  • c++程序员日常超实用工具(长期记录更新)
  • 疯狂星期四文案网第56天运营日记
  • 创意无界:云渲染如何让视觉创作触手可及
  • python如何下载svg图片
  • 【LeetCode - 每日1题】解数独
  • 虚幻引擎技术开放日!facecar分享3D HMI设计与UE开发经验
  • 基于单片机智能电子秤/称重计费
  • Idea启动错误-java.lang.OutOfMemoryError:内存不足错误。
  • DBeaverEE Mac 数据库管理工具
  • 决胜千里之外:服务器及硬件项目标书制作全流程与避坑指南
  • 《SVA断言系统学习之路》【02】并发断言
  • leetcode解题思路分析(一百六十六)1438 - 1444 题
  • 【机器学习基础】无监督学习算法的现代演进:从数据探索到智能系统的自主发现能力
  • 深入理解Nginx反向代理及其应用
  • 京东商品评论接口技术实现:从接口分析到数据挖掘全方案
  • 【Android】Notification 的基本使用
  • [线上问题排查]深度剖析:一条MySQL慢查询的全面优化实战
  • Cesium 入门教程(十四):鼠标键盘交互
  • 设置Ubuntu 22.04 LTS上的rsync同步服务
  • 提取动漫图像轮廓并拟合为样条曲线(MATLAB)
  • WEB漏洞挖掘篇(一) 基本概念、十大常見WEB漏洞
  • Python训练营打卡Day49-神经网络调参指南
  • 赵玉平《刘备谋略》读书笔记(上部)
  • 如何通过 AI IDE 集成开发工具快速生成简易留言板系统