【嵌入式C】RT-Thread 中结构体指针的强制类型转换?

一般情况下,不同类型的结构体指针一般不进行强制类型转换,而 rt-thread中有这大量关于 rt_device 这个结构体指针的强制类型转换。
本博文针对【不同类型结构体指针的强制类型转换】这一问题,做深入分析

1. 【结构体指针】强制转换过程

1.1 数据结构

以下是一个利用 rt-thread 音频框架设计的数据结构,命名为 rt_audio_device

内核组件 层的数据结构

在这里插入图片描述

驱动层的数据结构

在这里插入图片描述

1.2 rt-thread 组件中的音频注册函数

在这里插入图片描述
函数中,执行 rt_device_init 之后,会调用 _audio_dev_init 函数,在 _audio_dev_init 中出现了结构体指针的强制类型转换

1.3 结构体指针强制类型转换

在这里插入图片描述

2. 深层次剖析

2.1 数据结构的继承关系

驱动层 包含 内核的组件层
内核的组件层 包含rt_device基类
在这里插入图片描述

2.2 结构体的派生关系

音频设备结构体rt_audio_device是从rt-thread中特定的基类 rt_device 结构体派生的
在这种情况下,也可以直接使用 C 语言的强制类型转换语法
在这里插入图片描述

2.3 实例

在这里插入图片描述

3. 为什么能这样???

内核层在设计数据结构时比较巧妙
rt_device 结构体中有一个 空指针,*user_data ,他指向的是 驱动层定义的数据结构的地址
在这里插入图片描述
在这里插入图片描述
由于数据结构设计的非常巧妙,所以,_audio_dev_init 函数中的形参实际上就是指向 驱动层的 数据结构的结构体的成员地址。
因此进行结构体指针的强制类型转换时,访问的成员变量还是 驱动层这一个结构体变量,因此不会发生内存数据错误和越界

在这里插入图片描述

4. 总结

刨根问底时,感觉有点乱,总的来说;
不同类型的结构体指针进行强制类型转换不可以乱用,在rt-thread 中由于数据结构设计的非常巧妙,因此可以这么使用。。。

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

积跬步、至千里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值