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

相关文章

SpringBoot实现RSA+AES自动接口解密的实战指南

《SpringBoot实现RSA+AES自动接口解密的实战指南》在当今数据泄露频发的网络环境中,接口安全已成为开发者不可忽视的核心议题,RSA+AES混合加密方案因其安全性高、性能优越而被广泛采用,本... 目录一、项目依赖与环境准备1.1 Maven依赖配置1.2 密钥生成与配置二、加密工具类实现2.1

Nginx进行平滑升级的实战指南(不中断服务版本更新)

《Nginx进行平滑升级的实战指南(不中断服务版本更新)》Nginx的平滑升级(也称为热升级)是一种在不停止服务的情况下更新Nginx版本或添加模块的方法,这种升级方式确保了服务的高可用性,避免了因升... 目录一.下载并编译新版Nginx1.下载解压2.编译二.替换可执行文件,并平滑升级1.替换可执行文件

Go语言使用select监听多个channel的示例详解

《Go语言使用select监听多个channel的示例详解》本文将聚焦Go并发中的一个强力工具,select,这篇文章将通过实际案例学习如何优雅地监听多个Channel,实现多任务处理、超时控制和非阻... 目录一、前言:为什么要使用select二、实战目标三、案例代码:监听两个任务结果和超时四、运行示例五

精选20个好玩又实用的的Python实战项目(有图文代码)

《精选20个好玩又实用的的Python实战项目(有图文代码)》文章介绍了20个实用Python项目,涵盖游戏开发、工具应用、图像处理、机器学习等,使用Tkinter、PIL、OpenCV、Kivy等库... 目录① 猜字游戏② 闹钟③ 骰子模拟器④ 二维码⑤ 语言检测⑥ 加密和解密⑦ URL缩短⑧ 音乐播放

Oracle查询表结构建表语句索引等方式

《Oracle查询表结构建表语句索引等方式》使用USER_TAB_COLUMNS查询表结构可避免系统隐藏字段(如LISTUSER的CLOB与VARCHAR2同名字段),这些字段可能为dbms_lob.... 目录oracle查询表结构建表语句索引1.用“USER_TAB_COLUMNS”查询表结构2.用“a

python panda库从基础到高级操作分析

《pythonpanda库从基础到高级操作分析》本文介绍了Pandas库的核心功能,包括处理结构化数据的Series和DataFrame数据结构,数据读取、清洗、分组聚合、合并、时间序列分析及大数据... 目录1. Pandas 概述2. 基本操作:数据读取与查看3. 索引操作:精准定位数据4. Group

C语言中%zu的用法解读

《C语言中%zu的用法解读》size_t是无符号整数类型,用于表示对象大小或内存操作结果,%zu是C99标准中专为size_t设计的printf占位符,避免因类型不匹配导致错误,使用%u或%d可能引发... 目录size_t 类型与 %zu 占位符%zu 的用途替代占位符的风险兼容性说明其他相关占位符验证示

MySQL中EXISTS与IN用法使用与对比分析

《MySQL中EXISTS与IN用法使用与对比分析》在MySQL中,EXISTS和IN都用于子查询中根据另一个查询的结果来过滤主查询的记录,本文将基于工作原理、效率和应用场景进行全面对比... 目录一、基本用法详解1. IN 运算符2. EXISTS 运算符二、EXISTS 与 IN 的选择策略三、性能对比

SQL Server跟踪自动统计信息更新实战指南

《SQLServer跟踪自动统计信息更新实战指南》本文详解SQLServer自动统计信息更新的跟踪方法,推荐使用扩展事件实时捕获更新操作及详细信息,同时结合系统视图快速检查统计信息状态,重点强调修... 目录SQL Server 如何跟踪自动统计信息更新:深入解析与实战指南 核心跟踪方法1️⃣ 利用系统目录

全面解析Golang 中的 Gorilla CORS 中间件正确用法

《全面解析Golang中的GorillaCORS中间件正确用法》Golang中使用gorilla/mux路由器配合rs/cors中间件库可以优雅地解决这个问题,然而,很多人刚开始使用时会遇到配... 目录如何让 golang 中的 Gorilla CORS 中间件正确工作一、基础依赖二、错误用法(很多人一开