C编译器对数组越界不做检测,也就是数组越界后编译器不会给程序员报错,如果编译器对数组越界
做检测,那就解脱了程序员,不用当心数组越界,但肯定会付出一定的代价。而数组越界往往会出现
不可预知的问题。所以程序员时刻要小心数组是否越界。
下面是一道笔试题。考查数组越界。
在32Bit系统下,如下代码的运行结果是什么:
int main(){
int i;
int a[10];
for (i = 0; i <= 10; ++i)
{
a[i] = 0;
printf(“%d\n”, i);
}
exit(0);
}
如果你不仔细分析可能说结果是:
0
1
2
3
4
5
6
7
8
9
10
其实,这种分析理论上有一定的道理,但运行的结果并不是这。
运行的结果是个死循环。
该还考察了局部变量在栈上是怎么存放的。
i
a[9]
a[8]
a[7]
a[6]
a[5]
a[4]
a[3]
a[2]
a[1]
a[0]
栈的方向是从上到下的,当程序执行a[10]=0的时候实际上等效于执行i=0
所以程序的结果出现死循环。
阅读(3657) | 评论(0) | 转发(1) |