在C中,代码段:
int i;
double x[10];
for (i = 0; i <= 10; i++) {
x[i] = (double) i;
printf("%f\n", x[i]);
}
产生以下输出:
0.000000
1.000000
2.000000
3.000000
4.000000
5.000000
6.000000
7.000000
8.000000
9.000000
10.000000
然而,在Java中,代码片段(相同的代码)只是语法上的不同:
int i;
double[] x = new double[10];
for (i = 0; i <= 10; i++) {
x[i] = (double) i;
System.out.printf("%f\n", x[i]);
}
产生以下输出:
0.000000
1.000000
2.000000
3.000000
4.000000
5.000000
6.000000
7.000000
8.000000
9.000000
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10
at Array.main(Array.java:14)
为什么C编译器没有标记在数组边界外访问的尝试? 我在这里错过了什么吗?
答案 0 :(得分:6)
Java有数组边界检查,C没有。在Java中,当您访问索引10时会遇到运行时异常,在C中您会得到未定义的行为。在这种情况下,你把10.0
写到了一个你不被允许的地方,但是由于运气不好,程序就完成了。
另请注意,java数组具有length
属性,这样可以轻松避免此类错误。在C情况下,可以通过小心使用sizeof
运算符来获取数组的长度。但是经常使用指针而不是数组的事实(例如,当你将一个数组“传递”到一个带有指向数组元素的指针的函数时)意味着通常不会提供大小信息。
答案 1 :(得分:0)
在C中,我们可以访问未初始化为该变量的元素。在java中我们不能 去做。它严格检查边界数组。
每当数组中的元素出现时,Java都会执行边界检查 访问。边界检查是对数组索引的访问的位置 检查数组的大小 - 如果是,则抛出异常 该数组索引超出范围,并且大于该数组的大小 阵列。
C不执行边界检查。