在诸如 Java 之类的高级语言中,有一些函数会通过生成诸如 java.lang.ArrayIndexOutOfBoundsException 之类的异常来防止您越界访问数组。但是在 C 语言中,没有这样的功能,所以程序员需要注意这种情况。
输出 :
如果程序员不小心访问了超出范围的数组索引怎么办?
C 没有提供任何处理访问无效索引问题的规范。根据 ISO C 标准,它被称为未定义行为。 未定义行为 (UB) 是针对程序的当前状态(例如内存)执行计算机代码的结果,其行为未由代码可以遵循的语言规范规定。这通常发生在源代码的翻译者做出某些假设时,但这些假设在执行过程中没有得到满足。越界访问数组时未定义行为的示例
- 访问未分配的内存位置:程序可以访问它拥有的某块内存。
// Program to demonstrate
// accessing array out of bounds
#include <stdio.h>
int main()
{
int arr[] = {1,2,3,4,5};
printf("arr [0] is %dn", arr[0]);
// arr[10] is out of bound
printf("arr[10] is %dn", arr[10]);
return 0;
}
arr [0] is 1 arr[10] is -1786647872在这里可以观察到,arr[10] 正在访问包含垃圾值的内存位置。
- 分段错误:程序可以访问一些不属于它的内存,这会导致程序崩溃,例如分段错误。
// Program to demonstrate
// accessing array out of bounds
#include <stdio.h>
int main()
{
int arr[] = {1,2,3,4,5};
printf("arr [0] is %dn",arr[0]);
printf("arr[10] is %dn",arr[10]);
// allocation memory to out of bound
// element
arr[10] = 11;
printf("arr[10] is %dn",arr[10]);
return 0;
}
- 输出: 运行时错误:分段错误(SIGSEGV)
- 在 C 编程中保持在数组的范围内,同时使用数组来避免任何此类错误。
- 然而,C++ 提供了std::vector类模板,它不需要执行边界检查。向量还具有可以执行边界检查的std::at()成员函数。