C语言中结构体在实战中的高级用法

2024-01-25 08:36

本文主要是介绍C语言中结构体在实战中的高级用法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1.结构体嵌套:

2.结构体位域:

3.结构体与指针:

4.结构体对齐和填充:

结构体对齐(Alignment):

例子:

结构体填充(Padding):

例子:

5.灵活数组成员:

6.结构体比较:

7.匿名结构体和共用体:


1.结构体嵌套:

结构体可以嵌套在其他结构体中,形成复合结构。这对于表示更复杂的数据结构很有用。

struct Date {int day;int month;int year;
};struct Person {char name[50];int age;struct Date birthdate;
};// 使用结构体嵌套
struct Person person1;
person1.birthdate.day = 1;
person1.birthdate.month = 1;
person1.birthdate.year = 1990;

2.结构体位域:

结构体位域允许你在一个结构体中指定每个成员占用的位数。这对于节省内存空间和处理硬件寄存器等场景很有用。

struct StatusRegister {unsigned int errorFlag : 1;unsigned int overflowFlag : 1;unsigned int reserved : 30;
};

3.结构体与指针:

结构体和指针可以相互配合使用,允许对结构体进行动态分配和动态访问

struct Point {int x;int y;
};struct Point *ptrToPoint = (struct Point *)malloc(sizeof(struct Point));// 使用指针访问结构体成员
ptrToPoint->x = 10;
ptrToPoint->y = 20;

4.结构体对齐和填充:

结构体成员在内存中的存储通常受到对齐和填充的影响。你可以使用特定的编译指令(例如#pragma pack)来控制对齐和填充。

#pragma pack(push, 1) // 设置字节对齐为1
struct PackedStruct {char c;int i;
};
#pragma pack(pop) // 恢复默认对齐设置

补充知识:

结构体对齐(Alignment):

对齐是指结构体成员在内存中的存储位置相对于结构体的起始地址的偏移。例如,如果一个int类型的成员要求在4字节对齐,那么它将会从结构体的起始地址处偏移至下一个4的倍数的地址。

例子:
struct Example {char c;    // 1字节int i;     // 4字节,按照4字节对齐double d;  // 8字节,按照8字节对齐
};

在这个例子中,如果没有对齐要求,结构体的大小将是1 + 4 + 8 = 13字节。但是,由于对齐的存在,char c后面会有3字节的填充,使得int i从4字节对齐,double d从8字节对齐。因此,结构体的实际大小是16字节。

结构体填充(Padding):

填充是为了满足对齐要求而在结构体成员之间插入的额外字节。填充确保每个成员都位于其所需的对齐边界上。填充的大小取决于结构体成员的数据类型和对齐要求。

例子:
struct Example {char c1;    // 1字节// 3字节填充int i;      // 4字节char c2;    // 1字节// 3字节填充double d;   // 8字节
};

在这个例子中,c1i之间有3字节的填充,保证int i从4字节对齐。类似地,c2d之间也有3字节的填充,保证double d从8字节对齐。

5.灵活数组成员:

结构体可以包含灵活数组成员,这允许动态分配数组大小。

struct DynamicArray {int length;int array[]; // 灵活数组成员
};struct DynamicArray *arr = malloc(sizeof(struct DynamicArray) + 5 * sizeof(int));
arr->length = 5;

6.结构体比较:

结构体之间可以进行比较,但需要逐个比较结构体的成员。为了方便比较,可以使用memcmp函数。

struct Point {int x;int y;
};struct Point p1 = {1, 2};
struct Point p2 = {1, 2};if (memcmp(&p1, &p2, sizeof(struct Point)) == 0) {printf("Points are equal\n");
}

7.匿名结构体和共用体:

C11标准引入了匿名结构体和共用体,允许在不使用结构体或共用体名称的情况下定义它们。

union {struct {int x;int y;};struct {float latitude;float longitude;};
} position;position.x = 10;
position.y = 20;
// 或者
position.latitude = 37.7749;
position.longitude = -122.4194;

这篇关于C语言中结构体在实战中的高级用法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/642690

相关文章

MySQL复合查询从基础到多表关联与高级技巧全解析

《MySQL复合查询从基础到多表关联与高级技巧全解析》本文主要讲解了在MySQL中的复合查询,下面是关于本文章所需要数据的建表语句,感兴趣的朋友跟随小编一起看看吧... 目录前言:1.基本查询回顾:1.1.查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大写的J1.2.按照部门

Python中Flask模板的使用与高级技巧详解

《Python中Flask模板的使用与高级技巧详解》在Web开发中,直接将HTML代码写在Python文件中会导致诸多问题,Flask内置了Jinja2模板引擎,完美解决了这些问题,下面我们就来看看F... 目录一、模板渲染基础1.1 为什么需要模板引擎1.2 第一个模板渲染示例1.3 模板渲染原理二、模板

SpringBoot中四种AOP实战应用场景及代码实现

《SpringBoot中四种AOP实战应用场景及代码实现》面向切面编程(AOP)是Spring框架的核心功能之一,它通过预编译和运行期动态代理实现程序功能的统一维护,在SpringBoot应用中,AO... 目录引言场景一:日志记录与性能监控业务需求实现方案使用示例扩展:MDC实现请求跟踪场景二:权限控制与

SpringBoot3.4配置校验新特性的用法详解

《SpringBoot3.4配置校验新特性的用法详解》SpringBoot3.4对配置校验支持进行了全面升级,这篇文章为大家详细介绍了一下它们的具体使用,文中的示例代码讲解详细,感兴趣的小伙伴可以参考... 目录基本用法示例定义配置类配置 application.yml注入使用嵌套对象与集合元素深度校验开发

SpringBoot UserAgentUtils获取用户浏览器的用法

《SpringBootUserAgentUtils获取用户浏览器的用法》UserAgentUtils是于处理用户代理(User-Agent)字符串的工具类,一般用于解析和处理浏览器、操作系统以及设备... 目录介绍效果图依赖封装客户端工具封装IP工具实体类获取设备信息入库介绍UserAgentUtils

C语言中位操作的实际应用举例

《C语言中位操作的实际应用举例》:本文主要介绍C语言中位操作的实际应用,总结了位操作的使用场景,并指出了需要注意的问题,如可读性、平台依赖性和溢出风险,文中通过代码介绍的非常详细,需要的朋友可以参... 目录1. 嵌入式系统与硬件寄存器操作2. 网络协议解析3. 图像处理与颜色编码4. 高效处理布尔标志集合

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服

Spring Boot 整合 SSE的高级实践(Server-Sent Events)

《SpringBoot整合SSE的高级实践(Server-SentEvents)》SSE(Server-SentEvents)是一种基于HTTP协议的单向通信机制,允许服务器向浏览器持续发送实... 目录1、简述2、Spring Boot 中的SSE实现2.1 添加依赖2.2 实现后端接口2.3 配置超时时

Java中的@SneakyThrows注解用法详解

《Java中的@SneakyThrows注解用法详解》:本文主要介绍Java中的@SneakyThrows注解用法的相关资料,Lombok的@SneakyThrows注解简化了Java方法中的异常... 目录前言一、@SneakyThrows 简介1.1 什么是 Lombok?二、@SneakyThrows

Python中的getopt模块用法小结

《Python中的getopt模块用法小结》getopt.getopt()函数是Python中用于解析命令行参数的标准库函数,该函数可以从命令行中提取选项和参数,并对它们进行处理,本文详细介绍了Pyt... 目录getopt模块介绍getopt.getopt函数的介绍getopt模块的常用用法getopt模