空指针弱问

[复制链接]
4998|22
 楼主| eng588 发表于 2011-9-29 15:13 | 显示全部楼层 |阅读模式
void increase(unsigned char *p){
   if(p != NULL)
     (*p)++;
}

我理解NULL就是0,假设有变量a,其地址恰好是0,则increase(&a)不能实现功能。
香水城 发表于 2011-9-29 15:17 | 显示全部楼层
怎么可能有变量的地址恰好为0呢?
 楼主| eng588 发表于 2011-9-29 16:30 | 显示全部楼层
STM8S的RAM就是从地址0处开始的呀!
jackyard 发表于 2011-9-29 16:35 | 显示全部楼层
一般编译器已经处理了,不会有指针指向0地址。
 楼主| eng588 发表于 2011-9-29 16:40 | 显示全部楼层
我用cosmic编译器,查看其map文件,在地址0处放了个变量。
如果我修改代码取这个变量地址,编译器就自动把这个变量移到别处了。
 楼主| eng588 发表于 2011-9-29 16:41 | 显示全部楼层
是这样的吗?
 楼主| eng588 发表于 2011-9-29 16:57 | 显示全部楼层
我刚试了一下,我的编译器不能区别0地址。
mohanwei 发表于 2011-9-29 22:23 | 显示全部楼层
真还没见过能定义到0地址的变量……:lol
ahgao 发表于 2011-9-30 01:25 | 显示全部楼层
楼主你理解事情的方式很有个性啊。第一段程序你对逻辑的解读是没有问题的,但是一般我都这么解读它的意图,如果指针不为NULL,则对指针指向的数据加1。为什么这么解读呢,因为通常NULL指针是非法值,不允许对其指向的内容操作的。。
 楼主| eng588 发表于 2011-9-30 08:28 | 显示全部楼层
8# mohanwei

stm8s把全局变量放倒0地址处,我记得51也是从0地址开始编址RAM,这个用的可就广了
 楼主| eng588 发表于 2011-9-30 08:40 | 显示全部楼层
楼主你理解事情的方式很有个性啊。第一段程序你对逻辑的解读是没有问题的,但是一般我都这么解读它的意图,如果指针不为NULL,则对指针指向的数据加1。为什么这么解读呢,因为通常NULL指针是非法值,不允许对其指向 ...
ahgao 发表于 2011-9-30 01:25

“理解”是“理解”,但代码是否按照你得“理解”做?
为何NULL指针是非法指针?我想那种写法脱胎于X86,此后被不加思索的应用。
香水城 发表于 2011-9-30 09:35 | 显示全部楼层
“理解”是“理解”,但代码是否按照你得“理解”做?
为何NULL指针是非法指针?我想那种写法脱胎于X86,此后被不加思索的应用。
eng588 发表于 2011-9-30 08:40


LZ不能这么说。

如果说别人不加思索,相必你思索过了,那么你认为如果不用NULL作为非法指针,用什么值更好呢?
香水城 发表于 2011-9-30 09:37 | 显示全部楼层
我用cosmic编译器,查看其map文件,在地址0处放了个变量。
如果我修改代码取这个变量地址,编译器就自动把这个变量移到别处了。
eng588 发表于 2011-9-29 16:40


根据LZ在5楼的描述,可以看出编译器注意了这个问题,并成功地回避了变量地址0的指针。
ganxiang 发表于 2011-9-30 10:48 | 显示全部楼层
还真没有想个过个问题呢。NULL真就是零吗?
 楼主| eng588 发表于 2011-9-30 10:52 | 显示全部楼层
根据LZ在5楼的描述,可以看出编译器注意了这个问题,并成功地回避了变量地址0的指针。
香水城 发表于 2011-9-30 09:37

我在7楼时说了,我试了编译器,它没有我想的那么智能。
如果一定要用空指针,只能根据自己的MCU重新定义这个NULL值,将它定义成一个
保留的、不使用的地址。
mcu_electron 发表于 2011-9-30 12:15 | 显示全部楼层
指针为0的意思应该是该指针并不指向任何对象,照程序来看当P为0的它并不应该指向任何对象!若再想对指针为0的地方做操作且不是有一点矛盾。
ahgao 发表于 2011-9-30 12:17 | 显示全部楼层
本帖最后由 ahgao 于 2011-9-30 12:20 编辑

NULL指针是一个逻辑概念,它不一定非得是0。

C不禁止使用值为0的指针,你大可按自己喜欢得方式去做。可是为什么会有NULL指针呢,因为我们需要一个不指向任何有效内容的指针以表明某种用途,比如,分配内存失败。但是NULL指针既然是一个变量,它也是必须要有一个值的,用0来表示NULL是最合适的。当然-1似乎也是一个选择,但是当需要进行逻辑判断是-1显然不如0好。因为CPU只有测试为0的指令没有测试为-1的指令。

这个x86结构没有任何关系。

评分

参与人数 1威望 +4 收起 理由
香水城 + 4 分析全面

查看全部评分

wnagchaobq 发表于 2011-9-30 12:18 | 显示全部楼层
这个问题在C专家编程以及C缺陷和陷阱中讲的很清楚的……
sysdriver 发表于 2011-9-30 12:25 | 显示全部楼层
LZ在研究内存吗?为什么要在意那个0地址,使用C语言时,引用一个变量的绝对地址是常见,但很少见给一个变量分配绝对地址,因为C编译器会优化分配的。
zhangzufei11 发表于 2011-9-30 12:39 | 显示全部楼层
空指针其实就是一个函数的初始化  这是我的理解
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:和平時期做牛馬,戰爭時期當炮灰

82

主题

179

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部