场景一:访问数组末尾元素之后的位置
- 原因:数组下标从0开始,最大有效下标为数组长度减1。当访问超出这个范围时,就会发生越界。
- 代码示例:
#include <stdio.h>
int main() {
int arr[5] = {1, 2, 3, 4, 5};
// 访问arr[5],越界,因为有效下标范围是0到4
printf("%d\n", arr[5]);
return 0;
}
场景二:循环遍历数组时边界控制不当
- 原因:在使用循环遍历数组时,如果循环条件设置错误,导致访问到数组范围之外的元素。
- 代码示例:
#include <stdio.h>
int main() {
int arr[5] = {1, 2, 3, 4, 5};
for (int i = 0; i <= 5; i++) {
// 当i等于5时,访问arr[5]越界,正确应该是i < 5
printf("%d\n", arr[i]);
}
return 0;
}
场景三:多维数组下标的计算错误
- 原因:多维数组需要正确计算每个维度的偏移量,如果计算失误,就可能访问到错误的内存位置。
- 代码示例:
#include <stdio.h>
int main() {
int arr[3][3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
// 这里错误的计算导致访问越界,假设想访问arr[1][2],却写成了arr[2][3]
printf("%d\n", arr[2][3]);
return 0;
}