在C中,代码片段:
int i;
double x[10];
for (i = 0; i <= 10; i++) {
x[i] = (double) i;
printf("%f\n", x[i]);
}
Run Code Online (Sandbox Code Playgroud)
产生以下输出:
0.000000
1.000000
2.000000
3.000000
4.000000
5.000000
6.000000
7.000000
8.000000
9.000000
10.000000
Run Code Online (Sandbox Code Playgroud)
但是,在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]);
}
Run Code Online (Sandbox Code Playgroud)
产生以下输出:
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)
Run Code Online (Sandbox Code Playgroud)
为什么C编译器没有标记在数组边界外访问的尝试?我在这里错过了什么吗?
Java有数组边界检查,C没有.在Java中,当您访问索引10时会出现运行时异常,在C中您会得到未定义的行为.在这种情况下,你写10.0了一些你不允许的地方,但是由于运气不好,程序就完成了.
还要注意java数组有一个length属性,这样可以很容易地避免这种错误.在C情况下,可以通过仔细使用sizeof运算符来获得数组的长度.但是经常使用指针而不是数组的事实(例如,当你将一个数组"传递"到一个带有指向数组元素的指针的函数时)意味着通常不会提供大小信息.