搜索
bottom↓
回复: 14

结构体强制类型这样子转化真的没有问题吗?

[复制链接]

出0入10汤圆

发表于 2014-10-9 21:33:36 | 显示全部楼层 |阅读模式
本帖最后由 10xjzheng 于 2014-10-9 21:36 编辑

在uC/OS-III中有两种结构体os_pend_obj和os_sem(注:这里下面不要注意大小写问题,因为有typedef  struct  os_sem   OS_SEM;),根据下面的定义可以知道,两个的不同只是后面部分,前面部分完全相同。
struct  os_pend_obj
{
    OS_OBJ_TYPE          Type;
    CPU_CHAR            *NamePtr;
    OS_PEND_LIST         PendList;                          /* List of tasks pending on object                        */
#if OS_CFG_DBG_EN > 0u
    void                *DbgPrevPtr;
    void                *DbgNextPtr;
    CPU_CHAR            *DbgNamePtr;
#endif

};

struct  os_sem
{
    OS_OBJ_TYPE          Type;                              /* Semaphore                                              */
    CPU_CHAR            *NamePtr;                           /* Should be set to OS_OBJ_TYPE_SEM                       */
    OS_PEND_LIST         PendList;                          /* Pointer to Semaphore Name (NUL terminated ASCII)       */
#if OS_CFG_DBG_EN > 0u
    OS_SEM              *DbgPrevPtr;
    OS_SEM              *DbgNextPtr;
    CPU_CHAR            *DbgNamePtr;
#endif

    OS_SEM_CTR           Ctr;                               /* List of tasks waiting on event flag group              */
    CPU_TS               TS;
};

突然在一个函数中看到一个os_sem定义的变量p_sem被os_pend_obj类型给强制转化了,这样子真的可以吗?前面加个(void *)又是什么意思?
(OS_PEND_OBJ *)((void *)p_sem)

出0入10汤圆

 楼主| 发表于 2014-10-9 21:41:45 | 显示全部楼层
看到有这样子的

出0入0汤圆

发表于 2014-10-9 21:43:57 | 显示全部楼层
先强制转化为空指针,再转化为指向OS_PEND_OBJ的指针

出0入10汤圆

 楼主| 发表于 2014-10-9 21:46:41 | 显示全部楼层
顺便查了下空指针的概念,摘自:http://zhidao.baidu.com/link?url ... EIxN0_PHekiKZ-yX6Rq
这样一看才知道大家对空指针的概念如此浑浊哦!!
首先:
void* 这不叫空指针,这叫无确切类型指针.这个指针指向一块内存,却没有告诉程序该用何种方式来解释这片内存.所以这种类型的指针不能直接进行取内容的操作.必须先转成别的类型的指针才可以把内容解释出来.

还有'\0',这也不是空指针所指的内容. '\0'是表示一个字符串的结尾而已,并不是NULL的意思.

真正的空指针是说,这个指针没有指向一块有意义的内存,比如说:
char* k;
这里这个k就叫空指针.我们并未让它指向任意地点.
又或者
char* k = NULL;
这里这个k也叫空指针,因为它指向NULL 也就是0,注意是整数0,不是'\0'
一个空指针我们也无法对它进行取内容操作.
空指针只有在真正指向了一块有意义的内存后,我们才能对它取内容.也就是说要这样
k = "hello world!";
这时k就不是空指针了.

出0入0汤圆

发表于 2014-10-9 21:48:05 | 显示全部楼层
指针 弱项

出0入0汤圆

发表于 2014-10-9 21:57:20 | 显示全部楼层
通用指针:可以指向任意类型,可以强制转换成任意类型指针。 (void*):强制转换成通用指针。

出130入129汤圆

发表于 2014-10-9 22:00:27 | 显示全部楼层
在QP状态机里面的代码很多这样子用的,其实就类似C++里面父类子类

出0入0汤圆

发表于 2014-10-9 22:01:38 | 显示全部楼层
顺便说下,将p_sem直接强制转换成 OS_PEND_OBJ * 类型是不被允许的,必须先转换成通用指针类型,再强制转换成 OS_PEND_OBJ * 类型。

出0入10汤圆

 楼主| 发表于 2014-10-9 22:06:55 | 显示全部楼层
azeng 发表于 2014-10-9 22:01
顺便说下,将p_sem直接强制转换成 OS_PEND_OBJ * 类型是不被允许的,必须先转换成通用指针类型,再强制转换 ...

有没有什么相关的文档什么的看下,这块有没有人讲?

出0入0汤圆

发表于 2014-10-9 22:57:35 | 显示全部楼层
说一下自已的想法。这样的强制转化,重点不是结构中高低地址类型是否要相同。而是被强制转化的变量所占用的空间要比转化后的变量所占用的空间大或相等。若小于,那这种转化在操作时要小心再小心的防止修改到变量本身空间外的地址空间(就像2楼那种操作,感觉很危险。还好只是举例)。

出0入0汤圆

发表于 2014-10-9 23:07:50 | 显示全部楼层
在某些特殊的情况下会有问题,例如:访问对齐有限制的时候。

出0入0汤圆

发表于 2014-10-10 08:31:54 | 显示全部楼层
10xjzheng 发表于 2014-10-9 21:46
顺便查了下空指针的概念,摘自:http://zhidao.baidu.com/link?url=ixHODRQSGJEdpwexFpRSB5JoCIIEq2jm4go8p ...

受教 以前一直含糊

出0入0汤圆

发表于 2014-10-10 08:36:44 | 显示全部楼层
pigy0754 发表于 2014-10-9 22:57
说一下自已的想法。这样的强制转化,重点不是结构中高低地址类型是否要相同。而是被强制转化的变量所占用的 ...

小的话 怎么会修改到地址意外的内容

出0入0汤圆

发表于 2014-10-10 09:14:52 来自手机 | 显示全部楼层
对齐是个问题,要非常小心

出0入0汤圆

发表于 2014-10-10 21:21:22 | 显示全部楼层
本帖最后由 azeng 于 2014-10-10 21:22 编辑
10xjzheng 发表于 2014-10-9 22:06
有没有什么相关的文档什么的看下,这块有没有人讲?


通用指针的概念,网上资料很多,至于指针变量之间赋值的问题,谭浩强的书上应该提到过的。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-10 08:43

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表