结构体被强制转换问题???求解 谢谢!!!!!!

小小峰逍遥 2018-01-18 10:23:17
定义结构 struct abc_t
{
内容自定义
}

定义结构 struct efg_t
{
内容自定义
}
abc_t* AAA
efg_t* BBB= (efg_t*)( (char*)AAA+ 2 );

问题:AAA地址+2,强制转换为efg_t结构体,然后赋值地址给BBB,是不是结构abc_t和efg_t必须一样??还是这两个结构可以完全不一样?还是abc_t+2之后的成员和efg_t成员一样才能强制转换??
我所理解的是,既然AAA给地址到BBB,那么BBB就应该变成AAA了,,但是AAA被强制转换成结构 efg_t 的过程不能理解(假设两个结构不一样怎么理解)。望赐教~谢谢
...全文
578 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
faihung 2018-01-18
  • 打赏
  • 举报
回复
引用 1 楼 cfjtaishan 的回复:
不一定需要一样。
efg_t* BBB= (efg_t*)( (char*)AAA+ 2 );
这个操作是AAA指向的内存向后偏移2个字节,然后把地址赋值给指针BBB;为什么是偏移2个字节呢,因为AAA在偏移前做了强制类型转换char *,否则偏移的长度就不是2了,而是sizeof(abc_t) * 2个字节了。 另外赋值的是内存首地址,因为不论是abc_t类型的指针,还是efg_t的指针,都是存放的地址值,因此不能说BBB编程AAA,而是AAA偏移2个字节的地址赋值给了BBB,这样BBB就可以按照efg_t类型去访问这块地址。若AAA指向的的空间小于BBB的空间,在使用BBB访问结构体成员时会导致越界。因此,需要AAA指向有效内存空间需要比BBB的结构体类型长度要大,至少大于等于sizeof(abc_t) - 2
分析的很全面,学习了。
自信男孩 2018-01-18
  • 打赏
  • 举报
回复
不一定需要一样。
efg_t* BBB= (efg_t*)( (char*)AAA+ 2 );
这个操作是AAA指向的内存向后偏移2个字节,然后把地址赋值给指针BBB;为什么是偏移2个字节呢,因为AAA在偏移前做了强制类型转换char *,否则偏移的长度就不是2了,而是sizeof(abc_t) * 2个字节了。 另外赋值的是内存首地址,因为不论是abc_t类型的指针,还是efg_t的指针,都是存放的地址值,因此不能说BBB编程AAA,而是AAA偏移2个字节的地址赋值给了BBB,这样BBB就可以按照efg_t类型去访问这块地址。若AAA指向的的空间小于BBB的空间,在使用BBB访问结构体成员时会导致越界。因此,需要AAA指向有效内存空间需要比BBB的结构体类型长度要大,至少大于等于sizeof(abc_t) - 2
小小峰逍遥 2018-01-18
  • 打赏
  • 举报
回复
非常感谢层主,但是还有点小疑问,应该是至少大于等于sizeof(efg_t) + 2吧??? 因为最终转换是要转换为efg_t类型,因此应该是要满足sizeof(abc_t)>=(efg_t)+2 , +2是因为考虑到AAA偏移了两个字节。
paschen 2018-01-18
  • 打赏
  • 举报
回复
AAA给地址到BBB,不是表示BBB变成了AAA,而是按BBB的方式去解释AAA内存中的值,对于你的例子,(char*)AAA+ 2是AAA地址后面2个字节的位置,这个位置强制转换成了BBB结构体指针,这个地址可以是任意数据,但通常情况下应该刚好是个BBB类型的成员
赵4老师 2018-01-18
  • 打赏
  • 举报
回复
http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧