Perquisite:C / C++中的数组
在Java的高级语言中,有一些函数可以通过生成诸如Java.lang.ArrayIndexOutOfBoundsException之类的异常来防止您超出范围访问数组。但是对于C语言,则没有此类功能,因此程序员需要注意这种情况。
如果程序员不小心访问了超出范围的数组索引,该怎么办?
C没有提供任何规范来处理访问无效索引的问题。根据ISO C标准,它称为“未定义行为” 。
未定义行为(UB)是针对程序的当前状态(例如内存),执行其行为未由代码所遵循的语言规范所规定的行为的结果。当源代码的翻译程序做出某些假设时,通常会发生这种情况,但是在执行过程中不满足这些假设。
超出范围访问数组时未定义行为的示例
- 访问未分配的内存位置:程序可以访问其拥有的某些内存。
// Program to demonstrate // accessing array out of bounds #include
int main() { int arr[] = {1,2,3,4,5}; printf("arr [0] is %d\n", arr[0]); // arr[10] is out of bound printf("arr[10] is %d\n", arr[10]); return 0; } 输出 :
arr [0] is 1 arr[10] is -1786647872
在这里可以看到,arr [10]正在访问包含垃圾值的内存位置。
- 分段错误:程序可以访问其不拥有的某些内存,这可能导致程序崩溃,例如分段错误。
// Program to demonstrate // accessing array out of bounds #include
int main() { int arr[] = {1,2,3,4,5}; printf("arr [0] is %d\n",arr[0]); printf("arr[10] is %d\n",arr[10]); // allocation memory to out of bound // element arr[10] = 11; printf("arr[10] is %d\n",arr[10]); return 0; } 输出 :
运行时错误:分段错误(SIGSEGV)
重要事项:
- 在使用数组以避免任何此类错误的同时,请在C编程中留在数组的范围之内。
- 但是,C++提供了std :: vector类模板,该模板不需要执行边界检查。向量还具有std :: at()成员函数,可以执行边界检查。
想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。