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位机的内存 ...
随机推荐
- 在线程中使用Spring的Bean的方法、不推荐把“线程”注入到Spring
一.不推荐把"线程"注入到spring 将线程注入到Spring容器中并不是一个常见的做法,而且通常也不推荐这样做,原因如下: 生命周期管理困难: Spring管理的Bean生命周 ...
- code::blocks更改编译器配置
- 03 Xpath lxml库的安装和使用
Python lxml库的安装和使用 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 Xpath 表达式提供了良好的支持,因此能够了高效地解析 HTML/XML 文 ...
- Golang使用正则
目录 正则在线测试网站 Golang标准库--regexp 相关文章 课程学习地址: 手册地址: dome 正则在线测试网站 https://regex101.com/ Golang标准库--rege ...
- .NET周刊【5月第2期 2024-05-12】
国内文章 C#在工业数字孪生中的开发路线实践 https://mp.weixin.qq.com/s/b_Pjt2oii0Xa_sZp_9wYWg 这篇文章探讨了C#在工业数字孪生技术中的应用,介绍了三 ...
- FFmpeg开发笔记(二十一)Windows环境给FFmpeg集成AVS3解码器
AVS3是中国AVS工作组制定的第三代音视频编解码技术标准,也是全球首个已推出的面向8K及5G产业应用的视频编码标准.AVS工作组于2019年3月9日完成第三代AVS视频标准(AVS3)基准档次的制 ...
- 【超强SQL】WordPress批量修改指定分类下所有文章状态
前阵子主题君的某一个手游下载站的某一个分类,被百度K了,导致整个分类的文章收录都没了,这时候如果想要回复权重,就需要把这个分类的文章都删除了. 下面主题君给大家分享一段巨牛逼的SQL, WordPre ...
- 卷爆短剧出海:五大关键,由AIGC重构
短剧高温下,谈谈AIGC的助攻路线. 短剧,一个席卷全球的高温赛道. 以往只是踏着霸总题材,如今,内容循着精品化.IP化的自然发展风向,给内容.制作.平台等产业全链都带来新机,也让短剧消费走向文化深处 ...
- ef.core 事务不回滚的我遇到的一种情况分享
比如有几个Repository:_storeRep,_inventoryRep,_storeItemRep.基类封装有BeginTransaction(): using(var trans=_st ...
- django设置中文和上海时间
在settings.py配置文件中进行配置: # 设置为中文 LANGUAGE_CODE = 'zh-hans' # 设置 "亚洲/上海" 时区 TIME_ZONE = 'Asia ...