C语言:不定长结构体的实现方式
需求
有时候,我们会遇到一些情况:数据前部分相同,但是后部分长度不固定;数据格式相似,只是尾缀的长度不同,例如某些数据包,需要不定长度。
为了能够同时使用上不同长度的数据。可以用以下的方式实现。
方案
结构体尾部加指针
需要 管理尾部指针
struct s {
int len;
int *data;
};
struct s *p = malloc(sizeof(struct s));
p->data = malloc(...);
free(data);
free(p); // 完成内存回收,需要先free(data);
零长数组
GNU C 才有这种写法
如果编译器不支持,那么可以将data[0]
改成data[1]
struct s {
/* 固定的数据内容 */
int len;
int data[0];
};
struct s *p = malloc(sizeof(struct s) + xx); // xx 代表额外的长度
free(p); // 完成内存回收,而不需要再free(data);
宏定义实现
#define ST_WITH_LEN(size) \
struct _register_st##size \
{ \
char data[size]; \
}
int main(int argc, char *argv[])
{
int len = 5;
ST_WITH_LEN(len) a;
printf("%d\n", sizeof(a));
return 0;
}
C语言:不定长结构体的实现方式的更多相关文章
- C语言中的结构体,结构体数组
C语言中的结构体是一个小难点,下面我们详细来讲一下:至于什么是结构体,结构体为什么会产生,我就不说了,原因很简单,但是要注意到是结构体也是连续存储的,但要注意的是结构体里面类型各异,所以必然会产生内存 ...
- C语言如何定义结构体
原文地址 1. struct与typedef struct区别 struct是结构体的关键字,用来声明结构体变量如 struct student { char num[10]; ch ...
- Go语言基础之结构体
Go语言基础之结构体 Go语言中没有“类”的概念,也不支持“类”的继承等面向对象的概念.Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性. 类型别名和自定义类型 自定义类型 在G ...
- 4-17疑难点 c语言之【结构体对齐】
今天学习了结构体这一章节,了解到了结构体在分配内存的时候采取的是对齐的方式 例如: #include<stdio.h> struct test1 { int a; char b; shor ...
- C语言第九讲,结构体
C语言第九讲,结构体 一丶结构体的定义 在C语言中,可以使用结构体(Struct)来存放一组不同类型的数据.结构体的定义形式为: struct 结构体名{ 结构体所包含的变量或数组 }; 结构体是一种 ...
- C99_变长结构体实现
/************************************************************************* > File Name: C99_lengt ...
- C 语言实例 - 使用结构体(struct)
C 语言实例 - 使用结构体(struct) C 语言实例 C 语言实例 使用结构体(struct)存储学生信息. 实例 #include <stdio.h> struct student ...
- Verilog缺少一个复合数据类型,如C语言中的结构体
https://mp.weixin.qq.com/s/_9UsgUQv-MfLe8nS938cfQ Verilog中的数据类型(Data Type)是分散的,缺少一个复合数据类型:把多个wire, r ...
- GO学习-(13) Go语言基础之结构体
Go语言基础之结构体 Go语言中没有"类"的概念,也不支持"类"的继承等面向对象的概念.Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性. ...
- 1.3 C语言--指针与结构体
指针 指针概念的引入 关于内存 程序有数据和指令组成,数据和指令在执行过程中存放在内存中.变量是程序数据中的一种,因此变量也存储在内存中:内存中的每个字节都有一个唯一的编码,即内存地址.32位机的内存 ...
随机推荐
- vueJs开发音乐播放器第二篇(点击歌单跳出详情页)
继上一篇开发音乐播放器歌单列表页 (1.使用router定义跳转链接,2. 使用axios得到音乐第三方数据,并渲染到页面上,3.组件之间传值(props)) 1.接下来使用了vue-router路由 ...
- uniapp中使用极光推送
1.注册极光账号 2.注册几个主流手机厂商的开发者账号(注册手机厂商,可以保证app进程不在的时候走厂商通道推送消息) 3.配置uniapp极光插件 https://ext.dcloud.net.cn ...
- uniapp-vue3-oadmin手机后台实例|vite5.x+uniapp多端仿ios管理系统
原创vue3+uniapp+uni-ui跨端仿ios桌面后台OA管理模板Uni-Vue3-WeOS. uniapp-vue3-os一款基于uni-app+vite5.x+pinia等技术开发的仿ios ...
- 可视化学习:使用极坐标参数方程和SDF绘制有趣的图案
前言 本文将介绍如何使用极坐标参数方程和上一篇文章提到的距离场SDF来绘制有趣的图案. 说到曲线和几何图形的绘制,我们知道图形系统默认支持的是通过直角坐标绘制,但是有些曲线呢,不太容易使用直角坐标系来 ...
- 【C# mvc5】使用mvc5 +bootstrap+EF6搭建一个权限管理系统的心得体会
使用mvc5的体会,是 业务代码都可以独立分层,比如搭配多层架构,通过controller控制器传递需要渲染的列表,按钮.接受前端返回的实体模型等.总之我觉得要在前端渲染的数据可以写在controll ...
- latex图片格式问题解决(viso转PDF转eps)
latex图片格式问题解决(viso->PDF->eps) 1.viso绘图 如何让界面自动适应图的大小? 设计->大小->适应绘图 如何将VISIO图转换为PDF? 文件-& ...
- 007. gitlab仓库管理
1. gitlab创建组 创建后: 组管理: 组创建完成后,开始创建用户 2. gtilab创建用户 这里无法直接创建密码,需要创建用户后在对用户进行操作修改密码 密码和权限设置,取消和开启创建组权限 ...
- iOS MonkeyDev 尝试体验(非越狱开发)
一.前言 随着iOS系统的逐渐开放,iOS越狱需求的人越来越少,那么在非越狱系统上面开发越狱插件那将是一个不错的选择,在github上面发现一个开源的Xcode工程模板. 整合了越狱开发的工具.重签名 ...
- FFmpeg开发笔记(二十六)Linux环境安装ZLMediaKit实现视频推流
<FFmpeg开发实战:从零基础到短视频上线>一书在第10章介绍了轻量级流媒体服务器MediaMTX,通过该工具可以测试RTSP/RTMP等流媒体协议的推拉流.不过MediaMTX的功能 ...
- uniapp 判断当前是保存还是修改操作
步骤分析: 首先得确定你进入表单后传入了id或者整个对象[这里使用id来进行讲解]其次就是两个请求:POST(保存的) 和 PUT(修改的)最后就是通过传入的id是否存在进行判断即可 POST 请求 ...