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位机的内存 ...
随机推荐
- 抛砖系列之文本处理工具-awk
AWK是一个优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一.这种编程及数据操作语言(其名称得自于它的创始人阿尔佛雷德·艾侯.彼得·温伯格和布莱恩·柯林汉姓氏的首个字母 ...
- C 语言编程 — 代码规范
目录 文章目录 目录 前文列表 空行 空格 缩进 对齐 代码行 注释 示例 前文列表 <程序编译流程与 GCC 编译器> <C 语言编程 - 基本语法> <C 语言编程 ...
- element-plus表格添加删除行很慢
如果添加第一行或第二行就很慢,那么这个不是row-key的原因. 很有可能是nuxt的调试工具监控组件原因,可以试着把工具关了看看 devtools: { enabled: false }, 发布后不 ...
- .NET 中 Channel 类简单使用
Channel 是干什么的 The System.Threading.Channels namespace provides a set of synchronization data structu ...
- vue实现的常见的动画效果
本文包括的动画: zoom-in zoom-in-left zoom-in-right zoom-in-top zoom-in-bottom zoom-in-center-x zoom-in-cent ...
- ICESat-2 从ATL08中获取ATL03分类结果
ICESat-2 ATL03数据和ATL08数据的分段距离不一致,ATL08在ATL03的基础上重新分段,并对分段内的数据做处理得到一系列的结果,详情见数据字典: ATL08 Product Data ...
- Python并行运算——threading库详解(持续更新)
0. 写在前面:进程和线程 博文参考: Python的并行(持续更新)_python 并行-CSDN博客 <Python并行编程 中文版> 一些相关概念请见上一篇博文. 1. 在Pytho ...
- WPF实现轮播图
1.效果图 2.前端代码 <Window x:Class="LiveChartDemo.View.CarouselView" xmlns="http://schem ...
- 分享一个关于Avl树的迭代器算法
1 研究过程 前段时间在研究avl树的迭代实现,在节点不使用parent指针的情况下,如何使用堆栈来实现双向地迭代.我参考了网络上的大部分迭代器实现,要么是使用了parent指针(就像c++的map容 ...
- linux ssh key 登录
vim /etc/ssh/sshd_config #禁用root账户登录,非必要,但为了安全性,请配置 PermitRootLogin no # 是否让 sshd 去检查用户家目录或相关档案的权限数据 ...