请选择 进入手机版 | 继续访问电脑版
贠老师培训群:150322713    贠老师QQ:767708506

贠老师office培训-excel学习网

 找回密码
 立即注册
点击咨询贠老师
查看: 286|回复: 11

[C语言] 为什么要小心对待位于数组后面的那些元素的地址呢?

[复制链接]

3172

主题

3269

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
22893
发表于 2015-12-28 10:23:38 | 显示全部楼层 |阅读模式
如果你的程序是在理想的计算机上运行,即它的取址范围是从00000000到FFFFFFFF,那么你大可以放心,但是,实际情况往往不会这么简单。

在有些计算机上,地址是由两部分组成的,第一部分是一个指向某一块内存的起始点的指,针(即基地址),第二部分是相对于这块内存的起始点的地址偏移量。这种地址结构被称为段地址结构,子程序调用通常就是通过在栈指针上加上一个地址偏移量来实现的。采用段地址结构的最典型的例子是基于Intel 8086的计算机,所有的MS-DOS程序都在这种计算机上运行(在基于Pentium芯片的计算机上,大多数MS-DOS程序也在与8086兼容的模式下运行)。即使是性能优越的具有线性地址空间的RISC芯片,也提供了寄存器变址寻址方式,即用一个寄存器保存指向某一块内存的起始点的指针,用另一个寄存器保存地址偏移量。

如果你的程序使用段地址结构,而在基地址处刚好存放着数组a0(即基地址指针和&a0[0]相同),这会引出什么问题呢?既然基地址无法(有效地)改变,而偏移量也不可能是负值,因此“位于a0[0]前面的元素”这种说法就没有意义了,ANSIC标准明确规定引用这个元素的行为是没有定义的,这也就是9.1中所提到的方法可能行不通的原因。

同样,如果数组a(其元素个数为MAX)刚好存放在某段内存的尾部,那么地址&a[MAX]就是没有意义的,如果你的程序中使用了&a[MAX],而编译程序又要检查&a[MAX]是否有效,那么编译程序必然就会报告没有足够的内存来存放数组a。

尽管在编写基于Windows,UNIX或Macintosh的程序时不会遇到上述问题,但是C语言不仅仅是为这几种情况设计的,C语言必须适应各种各样的环境,例如用微处理器控制的烤面包炉,防抱死刹车系统,MS-DOS,等等。严格按C语言标准编写的程序能被顺利地编译并能服务于任何目的,但是,有时程序员也可以适度地背离C语言的标准,这要视程序员、编译程序和程序用户三者的具体要求而定。
回复

使用道具 举报

0

主题

969

帖子

50

积分

注册会员

Rank: 2

积分
50
发表于 2016-1-26 18:33:41 | 显示全部楼层
赞一个
回复 支持 反对

使用道具 举报

1

主题

917

帖子

5

积分

注册会员

Rank: 2

积分
5
发表于 2016-2-8 13:40:41 | 显示全部楼层
写的不错,支持一下哟
回复 支持 反对

使用道具 举报

2

主题

969

帖子

108

积分

注册会员

Rank: 2

积分
108
发表于 2016-2-13 10:57:08 | 显示全部楼层
顶一个
回复 支持 反对

使用道具 举报

2

主题

979

帖子

83

积分

注册会员

Rank: 2

积分
83
发表于 2016-8-31 20:27:27 | 显示全部楼层
不错,学习了
回复 支持 反对

使用道具 举报

0

主题

893

帖子

54

积分

注册会员

Rank: 2

积分
54
发表于 2016-12-23 14:40:09 | 显示全部楼层
还有许多问题不明白,有点恼火啊!
回复 支持 反对

使用道具 举报

1

主题

917

帖子

5

积分

注册会员

Rank: 2

积分
5
发表于 2017-8-29 19:43:59 | 显示全部楼层
写的不错,支持一下哟
回复 支持 反对

使用道具 举报

3

主题

1004

帖子

67

积分

注册会员

Rank: 2

积分
67
发表于 2017-11-25 10:07:18 | 显示全部楼层
还有许多问题不明白,有点恼火啊!
回复 支持 反对

使用道具 举报

1

主题

917

帖子

5

积分

注册会员

Rank: 2

积分
5
发表于 2017-12-8 17:31:07 | 显示全部楼层
抱走~老好人
回复 支持 反对

使用道具 举报

8

主题

1035

帖子

88

积分

注册会员

Rank: 2

积分
88
发表于 2018-7-23 18:33:08 | 显示全部楼层
希望楼主能够收集更多的资料,谢谢了!
回复 支持 反对

使用道具 举报

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

本版积分规则



陕ICP备15003731号  

贠老师培训 GMT+8, 2018-12-19 22:44 , Processed in 0.227721 second(s), 33 queries .

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