找回密码
 立即注册
查看: 1257|回复: 9

STC8H8K64U使用中的一个空指针判断求助

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:275
  • 最近打卡:2025-12-17 10:05:06

7

主题

59

回帖

844

积分

高级会员

积分
844
发表于 2025-11-28 13:33:06 | 显示全部楼层 |阅读模式
截图202511281330568412.jpg

我定义了两个结构体全局变量, g_JTT_SendMsg会判断为NULL而g_JTT_RcvMsg则不会, 然后我找了下MAP表发现如下:
截图202511281332128745.jpg
我怀疑是地址判断时被截断了, 可以为什么会出现这种情况?我又该如何避免解决该问题?
STC32G配置包:https://gitee.com/main.c/SxPackages.STC32G
STC8配置包:https://gitee.com/main.c/SxPackages.STC8
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:584
  • 最近打卡:2025-12-17 09:47:29

33

主题

2775

回帖

6154

积分

论坛元老

积分
6154
发表于 2025-11-28 14:01:17 | 显示全部楼层
往0地址上 定义一个不用的变量。。。剩下的就不会分配到地址0了。
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:25
  • 最近打卡:2025-12-16 08:39:56

8

主题

37

回帖

798

积分

高级会员

积分
798
发表于 2025-11-28 14:42:09 | 显示全部楼层
修改NULL的定义为最大值
微信qsssuv
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:275
  • 最近打卡:2025-12-17 10:05:06

7

主题

59

回帖

844

积分

高级会员

积分
844
发表于 2025-11-28 14:44:10 | 显示全部楼层
_奶*** 发表于 2025-11-28 14:01
往0地址上 定义一个不用的变量。。。剩下的就不会分配到地址0了。

那不是0地址, 是02000000地址, 会不会有01000000地址之类的?
STC32G配置包:https://gitee.com/main.c/SxPackages.STC32G
STC8配置包:https://gitee.com/main.c/SxPackages.STC8
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:682
  • 最近打卡:2025-12-18 09:49:39
已绑定手机

32

主题

370

回帖

3019

积分

论坛元老

机长

积分
3019
发表于 2025-12-2 19:08:00 | 显示全部楼层
xinxi*** 发表于 2025-11-28 14:44
那不是0地址, 是02000000地址, 会不会有01000000地址之类的?

你这个根本就不是地址截断问题。STC8H8K64U最多只支持16位地址,没发现你这个地址实际有32位吗?
0x02000000
0x02000009
以这两个地址为例,
红色部分才是真真正正的RAM地址,所以一个是NULL一个非NULL是完全正确的。
而你怀疑被截断的紫色部分,实际是指针的类型,0x02表示是pdata区指针。完整类型:0x00 → data/idata;
0x01、0x41 → xdata;0x02、0x42: pdata;0x03、0x43: code
而绿色部分,纯粹是调试工具为了字节对齐填充的数据,不然24位地址太别扭了。


PS:看起来你的调试工具挺好用的,是哪个?不是Keil自带的吧?能否分享下?

业余撸代码,专业开飞机 https://gitee.com/STC-MCU
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:275
  • 最近打卡:2025-12-17 10:05:06

7

主题

59

回帖

844

积分

高级会员

积分
844
发表于 2025-12-2 21:14:41 | 显示全部楼层
hsr*** 发表于 2025-12-2 19:08
你这个根本就不是地址截断问题。STC8H8K64U最多只支持16位地址,没发现你这个地址实际有32位吗?
0x020000 ...

您好, 我没用调试工具, 这两个地址是在map文件中查找到的, 问题是我将NULL定义为(xdata void *)0后就可以正常判断了, 说明还是地址截断了
STC32G配置包:https://gitee.com/main.c/SxPackages.STC32G
STC8配置包:https://gitee.com/main.c/SxPackages.STC8
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:682
  • 最近打卡:2025-12-18 09:49:39
已绑定手机

32

主题

370

回帖

3019

积分

论坛元老

机长

积分
3019
发表于 2025-12-2 23:28:19 | 显示全部楼层
xinxi*** 发表于 2025-12-2 21:14
您好, 我没用调试工具, 这两个地址是在map文件中查找到的, 问题是我将NULL定义为(xdata void *)0后就可以 ...

指针类型又不能参与数学运算,比较的时候当然得丢弃了……
业余撸代码,专业开飞机 https://gitee.com/STC-MCU
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:275
  • 最近打卡:2025-12-17 10:05:06

7

主题

59

回帖

844

积分

高级会员

积分
844
发表于 2025-12-3 08:43:51 | 显示全部楼层
hsr*** 发表于 2025-12-2 23:28
指针类型又不能参与数学运算,比较的时候当然得丢弃了……

难道你做函数不对指针类型的参数做==NULL的检查吗?
STC32G配置包:https://gitee.com/main.c/SxPackages.STC32G
STC8配置包:https://gitee.com/main.c/SxPackages.STC8
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:682
  • 最近打卡:2025-12-18 09:49:39
已绑定手机

32

主题

370

回帖

3019

积分

论坛元老

机长

积分
3019
发表于 2025-12-3 10:12:37 | 显示全部楼层
xinxi*** 发表于 2025-12-3 08:43
难道你做函数不对指针类型的参数做==NULL的检查吗?

我在PC/手机程序里面做,单片机程序里面还真不做。
单片机里面NULL貌似也是个合法的地址。
——————
PS:我是纯业余爱好的外行,也不确定我的方式对不对
业余撸代码,专业开飞机 https://gitee.com/STC-MCU
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:275
  • 最近打卡:2025-12-17 10:05:06

7

主题

59

回帖

844

积分

高级会员

积分
844
发表于 2025-12-3 10:15:50 | 显示全部楼层
hsr*** 发表于 2025-12-3 10:12
我在PC/手机程序里面做,单片机程序里面还真不做。
单片机里面NULL貌似也是个合法的地址。
——————

单片机里面的NULL定义为0或者(void *)0, 我怀疑还是数据位数的问题, 因为我重新定义了一个NULL宏定义为(xdata void *)0后再进行NULL判断就正确了
STC32G配置包:https://gitee.com/main.c/SxPackages.STC32G
STC8配置包:https://gitee.com/main.c/SxPackages.STC8
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-12-18 14:47 , Processed in 0.117370 second(s), 98 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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