xinxinsky 发表于 2025-11-28 13:33:06

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



我定义了两个结构体全局变量, g_JTT_SendMsg会判断为NULL而g_JTT_RcvMsg则不会, 然后我找了下MAP表发现如下:

我怀疑是地址判断时被截断了, 可以为什么会出现这种情况?我又该如何避免解决该问题?

_奶咖君_ 发表于 2025-11-28 14:01:17

往0地址上 定义一个不用的变量。。。剩下的就不会分配到地址0了。

青穗三三 发表于 2025-11-28 14:42:09

修改NULL的定义为最大值

xinxinsky 发表于 2025-11-28 14:44:10

_奶咖君_ 发表于 2025-11-28 14:01
往0地址上 定义一个不用的变量。。。剩下的就不会分配到地址0了。

那不是0地址, 是02000000地址, 会不会有01000000地址之类的?

hsrzq 发表于 2025-12-2 19:08:00

xinxinsky 发表于 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位地址太别扭了。
static/image/hrline/1.gif

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

xinxinsky 发表于 2025-12-2 21:14:41

hsrzq 发表于 2025-12-2 19:08
你这个根本就不是地址截断问题。STC8H8K64U最多只支持16位地址,没发现你这个地址实际有32位吗?
0x020000 ...

您好, 我没用调试工具, 这两个地址是在map文件中查找到的, 问题是我将NULL定义为(xdata void *)0后就可以正常判断了, 说明还是地址截断了

hsrzq 发表于 2025-12-2 23:28:19

xinxinsky 发表于 2025-12-2 21:14
您好, 我没用调试工具, 这两个地址是在map文件中查找到的, 问题是我将NULL定义为(xdata void *)0后就可以 ...

指针类型又不能参与数学运算,比较的时候当然得丢弃了……

xinxinsky 发表于 2025-12-3 08:43:51

hsrzq 发表于 2025-12-2 23:28
指针类型又不能参与数学运算,比较的时候当然得丢弃了……

{:yiwen:}难道你做函数不对指针类型的参数做==NULL的检查吗?

hsrzq 发表于 2025-12-3 10:12:37

xinxinsky 发表于 2025-12-3 08:43
难道你做函数不对指针类型的参数做==NULL的检查吗?

我在PC/手机程序里面做,单片机程序里面还真不做。
单片机里面NULL貌似也是个合法的地址。
——————
PS:我是纯业余爱好的外行,也不确定我的方式对不对

xinxinsky 发表于 2025-12-3 10:15:50

hsrzq 发表于 2025-12-3 10:12
我在PC/手机程序里面做,单片机程序里面还真不做。
单片机里面NULL貌似也是个合法的地址。
——————


单片机里面的NULL定义为0或者(void *)0, 我怀疑还是数据位数的问题, 因为我重新定义了一个NULL宏定义为(xdata void *)0后再进行NULL判断就正确了
页: [1]
查看完整版本: STC8H8K64U使用中的一个空指针判断求助