搜索
bottom↓
回复: 13

请教:代码调试,指针指向一个意外的值让我疑惑不解

[复制链接]

出0入0汤圆

发表于 2023-6-16 16:55:38 | 显示全部楼层 |阅读模式
环境:
我使用iar + msp430

备注:
1、16位单片机
2、单片机是小端模式
3、程序没有跑飞,且程序栈没有溢出
4、reg_arr是在另一个函数内定义的静态数组

如图:


问题:
为什么u32_val_1是1呢?

本帖子中包含更多资源

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

x

出0入984汤圆

发表于 2023-6-16 17:09:11 | 显示全部楼层
编译器优化 临时变量用了寄存器

出0入0汤圆

发表于 2023-6-16 17:48:44 | 显示全部楼层
本帖最后由 xy3dg12 于 2023-6-16 18:05 编辑
Himem 发表于 2023-6-16 17:09
编译器优化 临时变量用了寄存器
(引用自2楼)


用了寄存器变量也没什么。
有可能是开了编译优化,此时u32_val_1还没有被实际赋值,因为还没有使用。
可以加一句printf u32_val_1这个变量再看看

看错了,已经使用了u32_val_1,但有可能编译器认为后面不在使用u32_val_1了,就提前销毁了。
用混合模式看下汇编和C的对应就知道怎么回事了。

出0入16汤圆

发表于 2023-6-16 17:57:51 | 显示全部楼层
u32_ptr没有初始化内存地址,是野指针。。。

出0入0汤圆

 楼主| 发表于 2023-6-16 18:14:50 | 显示全部楼层
Himem 发表于 2023-6-16 17:09
编译器优化 临时变量用了寄存器
(引用自2楼)

感谢指教
我没有开启优化

本帖子中包含更多资源

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

x

出0入0汤圆

 楼主| 发表于 2023-6-16 18:15:27 | 显示全部楼层
xy3dg12 发表于 2023-6-16 17:48
用了寄存器变量也没什么。
有可能是开了编译优化,此时u32_val_1还没有被实际赋值,因为还没有使用。
可 ...
(引用自3楼)

感谢指教
现象依旧

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2023-6-16 18:21:05 | 显示全部楼层
擦鞋匠 发表于 2023-6-16 18:15
感谢指教
现象依旧
(引用自6楼)

你确定reg_buf->ptr指向的是reg_arr吗 ?从你的截图里看不出来

出0入18汤圆

发表于 2023-6-16 18:21:19 来自手机 | 显示全部楼层
你这有可能非对齐访问啊

出0入0汤圆

 楼主| 发表于 2023-6-16 18:42:54 | 显示全部楼层
xy3dg12 发表于 2023-6-16 18:21
你确定reg_buf->ptr指向的是reg_arr吗 ?从你的截图里看不出来
(引用自7楼)

本帖子中包含更多资源

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

x

出0入0汤圆

 楼主| 发表于 2023-6-16 19:00:04 | 显示全部楼层
tang_qianfeng 发表于 2023-6-16 18:21
你这有可能非对齐访问啊
(引用自8楼)

感谢指教
从u32_ptr的地址来看,是个奇数,很大可能是 非对齐访问 导致的。

所以,我在想,有时候我强制类型转换的时候,可能考虑的不够深入
默认,在不额外添加对齐修饰符的情况下:
例如,从uint32_t * 强制转换为uint8_t *是可以的
但是,从uint8_t *强制转换为uint32_t *可能就会出问题

我记得stm32f1/f4 cortex-m3/m4系列(我当前使用msp430f5)是支持非对齐访问的,是不是就不存在上述问题了?

出0入18汤圆

发表于 2023-6-16 20:03:27 来自手机 | 显示全部楼层
是的 ,m3,m4支持,m0不支持

出0入0汤圆

发表于 2023-6-16 20:52:44 来自手机 | 显示全部楼层
1,把include头文件放到整个文件开始,至少也是这个函数外面。
2,req_buf->ptr是什么类型,加10和uint8*哪个优先级高。
3,红框和上面一句太复杂了 u32_val_1=*(uint32_t)u08_ptr,甚至能和上面一行整合到一句,也不句影响阅读。

出0入0汤圆

 楼主| 发表于 2023-6-16 22:06:23 | 显示全部楼层
sbusr 发表于 2023-6-16 20:52
1,把include头文件放到整个文件开始,至少也是这个函数外面。
2,req_buf->ptr是什么类型,加10和uint8*哪 ...
(引用自12楼)

感谢指教

1,把include头文件放到整个文件开始,至少也是这个函数外面。
这是我调试这个问题时偷懒的写法,正式代码可不会这样

2,req_buf->ptr是什么类型,加10和uint8*哪个优先级高。
req_buf->ptr是uint8_t *类型,当然是强制类型转换优先级更高,确保指针自增,地址是以sizeof(uint8_t)作为步长

3,红框和上面一句太复杂了 u32_val_1=*(uint32_t)u08_ptr,甚至能和上面一行整合到一句,也不句影响阅读。
本来是放在一起的,调试时一开始不知道问题出在哪,分开写,想着利于找出问题

出0入0汤圆

发表于 2023-6-16 22:15:19 来自手机 | 显示全部楼层
擦鞋匠 发表于 2023-6-16 18:42

(引用自9楼)

那估计就是对齐的问题了。解决这种问题最简单的办法就是用混合模式跟着汇编走一遍就知道了。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-29 11:40

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

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