【嵌入式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)!