等号两边,赋值后不相等

zidane_yubo 2011-07-15 01:10:34
CFSSessionManagerData *pTmp = (CFSSessionManagerData *)(pTmp->m_pSessionMmsg);
赋值后,用GDB查看

指针pTmp 的值(为0x640770)不等于 pTmp->m_pSessionMmsg(0x64077000000000)

请问有高手知道不?是否是前面有内存问题引起的?
...全文
1860 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
一叶之舟 2011-07-20
  • 打赏
  • 举报
回复
pTmp->m_pSessionMmsg(0x64077000000000)
应该是一个64位的值,转换后数据截断了
0153 2011-07-20
  • 打赏
  • 举报
回复
不一样就对了,编译器给了你需要的,就这么简单。

你的pTmp->m_pSessionMmsg应该指向一个很复杂的类,而CFSSessionManagerData是这个复杂的类的基类之一,因此很复杂的类强转成基类很可能发生地址改变,但这恰恰是正确的,因为编译器确实把你需要的基类的地址给抽出来给你了,你对基类的任何调用都将是正确的。
山里来的鱼 2011-07-20
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 zidane_yubo 的回复:]

引用 11 楼 demon__hunter 的回复:
多继承或虚拟继承this调整,可以导致=两边不相等


是的,程序是用来多继承,请问这个问题应该怎么解决呢?
谢谢
[/Quote]
用试过dynamic_cast么?
liuxu93466 2011-07-19
  • 打赏
  • 举报
回复
CFSSessionManagerData *pTmp = (CFSSessionManagerData *)(pTmp->m_pSessionMmsg);

CFSSessionManagerData *pTmp = NULL;
pTmp=(CFSSessionManagerData *)(pTmp->m_pSessionMmsg);


这样应该没错了吧
titian2046 2011-07-19
  • 打赏
  • 举报
回复
比较初级的错误
CFSSessionManagerData *pTmp = (CFSSessionManagerData *)(pTmp->m_pSessionMmsg);

你都把pTMP本身给改了,赋完值当然不一样。
貌似 a=a-1 然后 a<>a-1
双杯献酒 2011-07-19
  • 打赏
  • 举报
回复
你先 sizeof(CFSSessionManagerData *) 和 sizeof(pTmp->m_pSessionMmsg) 看看是不是都是4或者8
梅名智 2011-07-19
  • 打赏
  • 举报
回复
*pTmp是个32位值吧

pTmp->m_pSessionMmsg是64位吧,你确定他的定义是指针。sizeof看看两个长度是不是一样的
gdfbjt4 2011-07-19
  • 打赏
  • 举报
回复
看不懂啊看不懂,新手菜鸟表式鸭梨很大
yrnaaa 2011-07-19
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分!
点点灵犀 2011-07-19
  • 打赏
  • 举报
回复
CFSSessionManagerData *pTmp = NULL; //指针为空

pTmp=(CFSSessionManagerData *)(pTmp->m_pSessionMmsg);//这样访问空指针中的数据一定会出现访问异常


CFSSessionManagerData *pTmp = (CFSSessionManagerData *)(pTmp->m_pSessionMmsg);//这句话明显有问题。你在使用pTmp->m_pSessionMmsg时,pTmp是未初始化的。

gin041013 2011-07-18
  • 打赏
  • 举报
回复
这是正确的,类型转换的指针偏移所致。
赵4老师 2011-07-15
  • 打赏
  • 举报
回复
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编并单步执行一遍不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编并单步执行。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”

提醒:
“学习用汇编语言写程序”

“VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编并单步执行一遍。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编并单步执行。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!
zidane_yubo 2011-07-15
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 interlace2010 的回复:]
你确定(pTmp->m_pSessionMmsg)是(CFSSessionManagerData *)这个类型吗?
[/Quote]
是的,而且不管怎么样,都已经进行了指针的强制转换
interlace2010 2011-07-15
  • 打赏
  • 举报
回复
你确定(pTmp->m_pSessionMmsg)是(CFSSessionManagerData *)这个类型吗?
菜鸟一个 2011-07-15
  • 打赏
  • 举报
回复
头一次遇到
zidane_yubo 2011-07-15
  • 打赏
  • 举报
回复
没人遇到过这个问题?
zidane_yubo 2011-07-15
  • 打赏
  • 举报
回复
同一个系统的程序的指针,怎么会不一样呢?
同为32 或者62位
majia2011 2011-07-15
  • 打赏
  • 举报
回复
pSessionMmsg是个32位值吧

赋值给pTmp是个64位指针,还用的强转,剩下那32位谁给的
zidane_yubo 2011-07-15
  • 打赏
  • 举报
回复
其他的指针赋值是好的,就这个突然在后面加了好多零
郁闷
majia2011 2011-07-15
  • 打赏
  • 举报
回复
把火车上的东西搬到卡车上

火车和卡车就必须一样吗?又不是变形金刚
加载更多回复(13)

65,176

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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