打印

空指针弱问

[复制链接]
3206|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地址。

使用特权

评论回复
5
eng588|  楼主 | 2011-9-29 16:40 | 只看该作者
我用cosmic编译器,查看其map文件,在地址0处放了个变量。
如果我修改代码取这个变量地址,编译器就自动把这个变量移到别处了。

使用特权

评论回复
6
eng588|  楼主 | 2011-9-29 16:41 | 只看该作者
是这样的吗?

使用特权

评论回复
7
eng588|  楼主 | 2011-9-29 16:57 | 只看该作者
我刚试了一下,我的编译器不能区别0地址。

使用特权

评论回复
8
mohanwei| | 2011-9-29 22:23 | 只看该作者
真还没见过能定义到0地址的变量……:lol

使用特权

评论回复
9
ahgao| | 2011-9-30 01:25 | 只看该作者
楼主你理解事情的方式很有个性啊。第一段程序你对逻辑的解读是没有问题的,但是一般我都这么解读它的意图,如果指针不为NULL,则对指针指向的数据加1。为什么这么解读呢,因为通常NULL指针是非法值,不允许对其指向的内容操作的。。

使用特权

评论回复
10
eng588|  楼主 | 2011-9-30 08:28 | 只看该作者
8# mohanwei

stm8s把全局变量放倒0地址处,我记得51也是从0地址开始编址RAM,这个用的可就广了

使用特权

评论回复
11
eng588|  楼主 | 2011-9-30 08:40 | 只看该作者
楼主你理解事情的方式很有个性啊。第一段程序你对逻辑的解读是没有问题的,但是一般我都这么解读它的意图,如果指针不为NULL,则对指针指向的数据加1。为什么这么解读呢,因为通常NULL指针是非法值,不允许对其指向 ...
ahgao 发表于 2011-9-30 01:25

“理解”是“理解”,但代码是否按照你得“理解”做?
为何NULL指针是非法指针?我想那种写法脱胎于X86,此后被不加思索的应用。

使用特权

评论回复
12
香水城| | 2011-9-30 09:35 | 只看该作者
“理解”是“理解”,但代码是否按照你得“理解”做?
为何NULL指针是非法指针?我想那种写法脱胎于X86,此后被不加思索的应用。
eng588 发表于 2011-9-30 08:40


LZ不能这么说。

如果说别人不加思索,相必你思索过了,那么你认为如果不用NULL作为非法指针,用什么值更好呢?

使用特权

评论回复
13
香水城| | 2011-9-30 09:37 | 只看该作者
我用cosmic编译器,查看其map文件,在地址0处放了个变量。
如果我修改代码取这个变量地址,编译器就自动把这个变量移到别处了。
eng588 发表于 2011-9-29 16:40


根据LZ在5楼的描述,可以看出编译器注意了这个问题,并成功地回避了变量地址0的指针。

使用特权

评论回复
14
ganxiang| | 2011-9-30 10:48 | 只看该作者
还真没有想个过个问题呢。NULL真就是零吗?

使用特权

评论回复
15
eng588|  楼主 | 2011-9-30 10:52 | 只看该作者
根据LZ在5楼的描述,可以看出编译器注意了这个问题,并成功地回避了变量地址0的指针。
香水城 发表于 2011-9-30 09:37

我在7楼时说了,我试了编译器,它没有我想的那么智能。
如果一定要用空指针,只能根据自己的MCU重新定义这个NULL值,将它定义成一个
保留的、不使用的地址。

使用特权

评论回复
16
mcu_electron| | 2011-9-30 12:15 | 只看该作者
指针为0的意思应该是该指针并不指向任何对象,照程序来看当P为0的它并不应该指向任何对象!若再想对指针为0的地方做操作且不是有一点矛盾。

使用特权

评论回复
17
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 分析全面
18
wnagchaobq| | 2011-9-30 12:18 | 只看该作者
这个问题在C专家编程以及C缺陷和陷阱中讲的很清楚的……

使用特权

评论回复
19
sysdriver| | 2011-9-30 12:25 | 只看该作者
LZ在研究内存吗?为什么要在意那个0地址,使用C语言时,引用一个变量的绝对地址是常见,但很少见给一个变量分配绝对地址,因为C编译器会优化分配的。

使用特权

评论回复
20
zhangzufei11| | 2011-9-30 12:39 | 只看该作者
空指针其实就是一个函数的初始化  这是我的理解

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

82

主题

179

帖子

0

粉丝