|
本帖最后由 了无 于 2019-7-18 10:15 编辑
我把问题简化一下有下面的语句
- typedef struct
- {
- uint8* data;
- uint32 ID;
- }FrameType;
- FrameType Frame;
- uint8 Buff[8];
- uint8 Buff2[8];
- 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个字节),所以没有表现出错误。
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
阿莫论坛才是最爱国的,关心国家的经济、社会的发展、担心国家被别国牵连卷入战争、知道珍惜来之不易的和平发展,知道师夷之长,关注世界的先进文化与技术,也探讨中国文化的博大精深,也懂得警惕民粹主义的祸国殃民等等等等,无不是爱国忧民的表现。(坛友:tianxian)
|