搜索
bottom↓
回复: 14

[QT]大家看看这个编译器导致的指针与数组的问题[结帖]

[复制链接]

出0入8汤圆

发表于 2019-7-18 08:45:46 | 显示全部楼层 |阅读模式
本帖最后由 了无 于 2019-7-18 10:15 编辑

我把问题简化一下有下面的语句

  1. typedef struct
  2. {
  3.      uint8* data;
  4.      uint32 ID;
  5. }FrameType;

  6. FrameType Frame;

  7. uint8 Buff[8];
  8. uint8 Buff2[8];
  9. Frame.data=Buff;

  10. memset(Frame.data,0xCC,8);
复制代码

在我的认知里,memset这句执行后,会把Buff里面的每个字节置为0xCC;但是昨天运行结果让我怀疑我一直认为正确的知识。
memset后,没把Buff里面的字节置位。而是把Frame地址后面的8个字节置为0xCC了。
昨天是用QT MSVC2017编译的。今天又用QT MinGW编译试了一下,发现MinGW执行的结果和我预想的一样。终于松了口气。
这种操作应该算是比较公认的,为啥MSVC编译器运行结果会偏离。还是我哪里操作不规范。memset这里我也不想用memset(Buff,0xCC,8);
因为有时候Frame.data需要切换一下buff,比如Frame.data=buff2,直接操作buff的话会降低语句的通用性。各位出出主意,看怎么解决。

====================================================================
结帖,问题已找到,上面的代码是我写帖子的时候从写的一段复杂代码里面抽象出来的。但是我没去测试我抽象的这段代码,刚刚看楼下坛友说是这段代码vs测试没问题,于是我才去
测试了一下,确实没问题,于是我查看我的源代码,发现在一个不起眼的地方,执行了这个,Frame.data=&test了。把Frame.data指向了一个局部变量了,所以set的时候出错。回想起来
我在写这句的时候,是复制了一个Frame.data=test;本来我要写*Frame.data=test的,这句写万后Frame.data=test;Qt提示代码有错误,是否自动修复。我让它自动修复了,结果修复
成Frame.data=&test;当时也没注意。MinGw之所以正常,可能是在MinGw分配地址的时候,估计把这个局部变量和Buff在一块分配着。所以set的时候也set到buff 了(前7字节,大部分情况只用到前3个字节),所以没有表现出错误。

阿莫论坛20周年了!感谢大家的支持与爱护!!

如果想吃一顿饺子,就得从冰箱里取出肉,剁馅儿,倒面粉、揉面、醒面,擀成皮儿,下锅……
一整个繁琐流程,就是为了出锅时那一嘴滚烫流油的热饺子。

如果这个过程,禁不住饿,零食下肚了,饺子出锅时也就不香了……《非诚勿扰3》

出0入0汤圆

发表于 2019-7-18 08:54:36 | 显示全部楼层
看不出来问题

出0入0汤圆

发表于 2019-7-18 08:58:36 来自手机 | 显示全部楼层
看起来没问题,你vs可以单步debug呀?看看改成什么了

出0入8汤圆

 楼主| 发表于 2019-7-18 08:59:51 | 显示全部楼层
nanfang2000 发表于 2019-7-18 08:58
看起来没问题,你vs可以单步debug呀?看看改成什么了

VS单步看了,就是把Frame地址后面8个字节memset为0xCC了

出0入0汤圆

发表于 2019-7-18 09:16:54 | 显示全部楼层
  1. typedef struct
  2. {
  3.      uint8* data;
  4.      uint32 ID;
  5. }FrameType;

  6. FrameType Frame;

  7. uint8 Buff[8];
  8. uint8 Buff2[8];
  9. Frame.data=Buff;

  10. memset(Frame.data,0xCC,8);
复制代码


你 Frame.data=Buff; ,所以你set的是 Buff

出0入0汤圆

发表于 2019-7-18 09:28:23 | 显示全部楼层
VS测试没有问题。

出0入8汤圆

 楼主| 发表于 2019-7-18 09:29:08 | 显示全部楼层
aozima 发表于 2019-7-18 09:16
你 Frame.data=Buff; ,所以你set的是 Buff

对,我的目的就是set Buff,但Msvc编译结果不是,set的是Frame开始的8个字节,把Frame.Id也给set了。用Mingw编译结果set的就是buff

出0入0汤圆

发表于 2019-7-18 09:36:42 | 显示全部楼层
本帖最后由 aozima 于 2019-7-18 09:40 编辑

Frame地址多少?sizeof(FrameType )是多大? Buff地址是多少?
请上编译后的汇编,以及调试时的截图。

出0入0汤圆

发表于 2019-7-18 09:40:35 | 显示全部楼层

你该不会说的是这吧

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2019-7-18 09:43:43 | 显示全部楼层
把Frame.Id也给set了

你截图末反应问题
你截图末列出frame地址
VC调试模式下,末初始化内存默认很烫,并不一定是你memset的。
你调试时可以列出 memset的3个参数

出0入0汤圆

发表于 2019-7-18 09:55:37 | 显示全部楼层
aozima 发表于 2019-7-18 09:43
你截图末反应问题
你截图末列出frame地址
VC调试模式下,末初始化内存默认很烫,并不一定是你memset的。

这是我截给楼主看的,我感觉他理解错了,这里面没有给ID赋值,然后你把Buff传给Frame.data,对应的ID就是Buff后面连续的内存,由于没有初始化默认就是0xcc,这个0xcc我看VS是这个值,并不一定。

出0入0汤圆

发表于 2019-7-18 10:16:11 | 显示全部楼层
hyghyg1234 发表于 2019-7-18 09:55
这是我截给楼主看的,我感觉他理解错了,这里面没有给ID赋值,然后你把Buff传给Frame.data,对应的ID就是 ...


弄错人了,握个爪!见谅!

出0入8汤圆

 楼主| 发表于 2019-7-18 10:17:46 | 显示全部楼层
hyghyg1234 发表于 2019-7-18 09:55
这是我截给楼主看的,我感觉他理解错了,这里面没有给ID赋值,然后你把Buff传给Frame.data,对应的ID就是 ...

已结帖,乌龙了,结果见楼主位。谢谢楼上各位参与讨论

出0入0汤圆

发表于 2019-7-18 10:48:36 | 显示全部楼层
memset之后引用一下Frame.data,不然有可能被编译器优化掉

出0入0汤圆

发表于 2019-7-18 11:07:02 | 显示全部楼层
VS调试模式未初始化的内存就是0xCCCCCC,所以你误以为把后面的写了,其实并不是
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-3-28 23:27

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

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