自学内容网 自学内容网

【嵌入式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 中由于数据结构设计的非常巧妙,因此可以这么使用。。。

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


原文地址:https://blog.csdn.net/qq_39217004/article/details/142825877

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!