嵌入式系统与单片机|技术阅读
登录|注册

您现在的位置是:嵌入式系统与单片机 > 技术阅读 > C语言为什么不检查数组下标

C语言为什么不检查数组下标


引言

》中有如下示例代码:

void main(){    int data[4] = {0, 1, 2, 3};    int *p;    p = data +2;    printf("p[-1] is %d\n",p[-1]); printf("*(p-1) is %d\n",*(p-1));}

运行结果如下

》)C语言很难检查下标合法性的。如果C语言检查数组是否越界,因为当数组出现在表达式中的时候,它会立刻被解读成指针。此外,使用其他的指针变量也可以指向数组的任意元素,并且这个指针可以随意进行加减运算。引用数组元素的时候,虽然你可以写成a[i],但是它只不过是*(a+i)的一种表达,C语言本身的语法是无法检查的,只能通过编译器检查。那么编译器将加入额外的代码用于检测数组是否越界,C的下标检查所涉及的开销比你开始想象的要多。编译器必须在程序中插入指令,证实下标的结果所引用的元素和指针表达式所指向的元素属于同一个数组,可能仅仅是个小功能,生成的程序的数组检查占有大量的代码空间,这必将影响程序的运行效率。这也让我意识到一个事情:数组的标识符(也就是数组名),它只包含并没有包含数组的长度的信息,它只是个地址信息,也就是上面说的数组名本质上是个常量指针。读到这里,请你想一下,C语言有提供数组长度的底层函数吗???答案是否定的,一般情况下,我们获取一个数组的长度,我们可以获取数组所占的内存大小,然后除以单个元素的内存大小计算数组长度。
int a[8];printf("%d",sizeof(a)/sizeof(a[0]));

 必读

  必读