了无 发表于 2019-7-18 08:45:46

[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个字节),所以没有表现出错误。

zllfdd 发表于 2019-7-18 08:54:36

看不出来问题

nanfang2000 发表于 2019-7-18 08:58:36

看起来没问题,你vs可以单步debug呀?看看改成什么了

了无 发表于 2019-7-18 08:59:51

nanfang2000 发表于 2019-7-18 08:58
看起来没问题,你vs可以单步debug呀?看看改成什么了

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

aozima 发表于 2019-7-18 09:16:54

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

hyghyg1234 发表于 2019-7-18 09:28:23

VS测试没有问题。

了无 发表于 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

aozima 发表于 2019-7-18 09:36:42

本帖最后由 aozima 于 2019-7-18 09:40 编辑

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

hyghyg1234 发表于 2019-7-18 09:40:35


你该不会说的是这吧

aozima 发表于 2019-7-18 09:43:43

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

hyghyg1234 发表于 2019-7-18 09:55:37

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


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

aozima 发表于 2019-7-18 10:16:11

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

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

了无 发表于 2019-7-18 10:17:46

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

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

michael.yang 发表于 2019-7-18 10:48:36

memset之后引用一下Frame.data,不然有可能被编译器优化掉

nanfang2000 发表于 2019-7-18 11:07:02

VS调试模式未初始化的内存就是0xCCCCCC,所以你误以为把后面的写了,其实并不是
页: [1]
查看完整版本: [QT]大家看看这个编译器导致的指针与数组的问题[结帖]