硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1485|回复: 4
收起左侧

ARM单片机0x00000000地址与NULL的关系?

[复制链接]

12

主题

53

回帖

89

积分

初级会员

面霸

积分
89
发表于 2024-8-10 01:50:10 来自手机 | 显示全部楼层 |阅读模式
0x00000000地址保存了栈顶地址,这是不是说明0x00000000为有意义的地址,这是否与指针为NULL冲突?应该怎么理解这个事情。
回复

使用道具 举报

3

主题

295

回帖

304

积分

高级会员

积分
304
发表于 2024-8-12 13:15:49 | 显示全部楼层
空指针是空指针,地址0是地址0,地址0放了栈顶地址,一般不为0,但空指针永远是为0的,修改或者解引用空指针会出问题,自己写个程序试一下就知道了
[C] 纯文本查看 复制代码
#define USERNULL ((void*)0)
if(USERNULL==0)
{ //dosomething};
回复

使用道具 举报

12

主题

53

回帖

89

积分

初级会员

面霸

积分
89
 楼主| 发表于 2024-8-13 13:14:46 来自手机 | 显示全部楼层
skyshine 发表于 2024-8-12 13:15
空指针是空指针,地址0是地址0,地址0放了栈顶地址,一般不为0,但空指针永远是为0的,修改或者解引用空指 ...

但地址0和空指针,表示方法没有区别呀
回复

使用道具 举报

268

主题

597

回帖

1401

积分

至尊会员

积分
1401
发表于 2024-11-16 12:11:46 | 显示全部楼层
1350280419 发表于 2024-8-13 13:14
但地址0和空指针,表示方法没有区别呀

空指针理论上并没有问题啊。只是在一些硬件体系里面(x86)引用了空指针会导致死机等非法错误。像在STM32这种单片机上,一般如读指针操作,也并不会出现什么错误。空指针对应地址为0时,读取的就是0地址的数据了。导致错误的原因其实是后续依据读出的数据进行的操作产生的错误。空指针产生的异常更多的是写操作,STM32的0地址是无法通过软件自身来写的,就产生了hardfault了。
回复

使用道具 举报

1

主题

12

回帖

15

积分

新手上路

积分
15
发表于 2025-2-20 13:10:28 | 显示全部楼层
NULL 的定义是(void*)0, 这个定义的意思是这是一个指针变量,这个变量的值是0,且这个指针是无类型指针。所以可以和任意的指针类型变量进行比较或复制操作。 你可以理解为你这个NULL就指向了你的的这个地址0,但是这个地址可不一定是你的物理地址0,在linux中,指向的是虚拟地址0。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-4-25 20:35 , Processed in 0.228974 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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