📜  在C / C++中超出范围访问数组

📅  最后修改于: 2021-05-26 03:42:31             🧑  作者: Mango

Perquisite:C / C++中的数组

在Java的高级语言中,有一些函数可以通过生成诸如Java.lang.ArrayIndexOutOfBoundsException之类的异常来防止您超出范围访问数组。但是对于C语言,则没有此类功能,因此程序员需要注意这种情况。

如果程序员不小心访问了超出范围的数组索引,该怎么办?

C没有提供任何规范来处理访问无效索引的问题。根据ISO C标准,它称为“未定义行为”
未定义行为(UB)是针对程序的当前状态(例如,内存)执行计算机行为的结果,该行为未由代码所遵循的语言规范所规定。当源代码的翻译程序做出某些假设时,通常会发生这种情况,但是在执行过程中不满足这些假设。

超出范围访问数组时未定义行为的示例

  1. 访问未分配的内存位置:程序可以访问其拥有的某些内存。
    // 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]正在访问包含垃圾值的内存位置。

  2. 分段错误:程序可以访问其不拥有的某些内存,这可能导致程序崩溃,例如分段错误。
    // 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基础课程》。