“编译器,你为什么不检查数组下标有没有溢出?”

1.给指针操作提供更多的空间

下面看例子:

#include<stdio.h>
int main(){
int array[5]={1,2,3,4,5};
int* parray=array+2;
printf("%d",parray[-1]);
return 0;
}

如果检查数组下标,上面这种就相当于是非法操作,编译器是无法通过的!这也是C语言的强大之处,使用起来非常灵活。

再比如:

#include<stdio.h>
int main(){
int array[5]={1,2,3,4,5};
int* parray=array;
printf("%d",2[parray]);
return 0;
}

2[parray]等价于parray[2],语法方面C语言默认它是正确的。

所以,C语言不对数组下标进行有效性检查,一方面是C本身就是非常灵活的语言,另一方面就是大大发挥指针的作用。

2.数组名只提供地址信息

数组名仅仅提供数组元素的首地址,不会提供数组长度的信息。所以某些函数需要用到数组长度时,可以通过参数传值传进去。

void fun(int array[],int maxsize){

printf("可能需要数组长度的信息");
}

3.降低运行效率

如果要检查数组下标有效性,编译器要在源代码编译完成之后生成的object代码里加入相关指令,用来判断数组下标是否越界以及相关指针所操作的元素是不是数组上的同一个元素,这不仅仅要耗费大量的时间,还要占用额外的空间。所以一般编译器为了提高运行效率,不会检查数组下标的有效性,有的编译器用检查数组下标的选项,也往往会提示程序员是否需要跳过此步骤。所以,数组下标的检查就往往成为了程序员的任务,确保不能非法访问其他未知内存的基础上让指针操作更加灵活。

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值