[QT]大家看看这个编译器导致的指针与数组的问题[结帖]
本帖最后由 了无 于 2019-7-18 10:15 编辑我把问题简化一下有下面的语句
typedef struct
{
uint8* data;
uint32 ID;
}FrameType;
FrameType Frame;
uint8 Buff;
uint8 Buff2;
Frame.data=Buff;
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个字节),所以没有表现出错误。
看不出来问题 看起来没问题,你vs可以单步debug呀?看看改成什么了 nanfang2000 发表于 2019-7-18 08:58
看起来没问题,你vs可以单步debug呀?看看改成什么了
VS单步看了,就是把Frame地址后面8个字节memset为0xCC了 typedef struct
{
uint8* data;
uint32 ID;
}FrameType;
FrameType Frame;
uint8 Buff;
uint8 Buff2;
Frame.data=Buff;
memset(Frame.data,0xCC,8);
你 Frame.data=Buff; ,所以你set的是 Buff VS测试没有问题。 aozima 发表于 2019-7-18 09:16
你 Frame.data=Buff; ,所以你set的是 Buff
对,我的目的就是set Buff,但Msvc编译结果不是,set的是Frame开始的8个字节,把Frame.Id也给set了。用Mingw编译结果set的就是buff 本帖最后由 aozima 于 2019-7-18 09:40 编辑
Frame地址多少?sizeof(FrameType )是多大? Buff地址是多少?
请上编译后的汇编,以及调试时的截图。
你该不会说的是这吧 把Frame.Id也给set了
你截图末反应问题
你截图末列出frame地址
VC调试模式下,末初始化内存默认很烫,并不一定是你memset的。
你调试时可以列出 memset的3个参数 aozima 发表于 2019-7-18 09:43
你截图末反应问题
你截图末列出frame地址
VC调试模式下,末初始化内存默认很烫,并不一定是你memset的。
这是我截给楼主看的,我感觉他理解错了,这里面没有给ID赋值,然后你把Buff传给Frame.data,对应的ID就是Buff后面连续的内存,由于没有初始化默认就是0xcc,这个0xcc我看VS是这个值,并不一定。 hyghyg1234 发表于 2019-7-18 09:55
这是我截给楼主看的,我感觉他理解错了,这里面没有给ID赋值,然后你把Buff传给Frame.data,对应的ID就是 ...
弄错人了,握个爪!见谅! hyghyg1234 发表于 2019-7-18 09:55
这是我截给楼主看的,我感觉他理解错了,这里面没有给ID赋值,然后你把Buff传给Frame.data,对应的ID就是 ...
已结帖,乌龙了,结果见楼主位。谢谢楼上各位参与讨论 memset之后引用一下Frame.data,不然有可能被编译器优化掉 VS调试模式未初始化的内存就是0xCCCCCC,所以你误以为把后面的写了,其实并不是
页:
[1]