首页 > 代码库 > C语言中的边界计算与不对称边界(一)

C语言中的边界计算与不对称边界(一)

1、如果一个数组有10个元素,那么这个数组下标的允许取值范围是什么呢?

       这个问题对于不同的程序设计语言有着不同的答案。例如,对于Fortran,PL/I以及Snobol4等程序语言,这个数组的下标取值缺省从1开始,而且这些语言也允许编程者另外指定数组下标的起始值。而对于Algol和Pascal语言,数组下标没有缺省的起始值,编程者必须显式的指定每个数组的下界与上界。在标准的Basic语言中,声明一个拥有10个元素的数组,实际上编译器分配了11个元素的空间,下标范围从0到10。

在C语言中,这个数组的下标范围是从0到9。一个拥有10个元素的数组中,存在下标为0的元素,却不存在下标为10的元素。C语言中的一个拥有n个元素的数组,却不存在下标为n的元素,它的元素的下标范围是从0到n-1为此,由其他程序语言转而使用C语言的程序员在使用数组时特别要注意。

例如:

int i, a[10];
for(i=1; i<=10; i++)
    a[i] = 0;
       这段代码本意是要设置数组a中所有元素为0,却产生了一个出人意料的“负效果”。在for语句的比较部分本来是i<10,却写成了i<=10,因此实际上并存在a[10]被设置为0,也就是内存中在数组a之后的一个字的内存被设置为0。如果用来编译这段程序的编译器按照内存地址递减的方式来给变量分配内存,那么内存中数组a之后的一个字实际上是分配给了整型变量i。此时,本来循环计数器i的值为10,循环体内将并不存在的a[10]设置为0,实际上却是将计数器i的值设置为0,这就陷入了一个死循环。