为什么我能够访问数组元素"outside"其范围?

Why am I able to access array elements "outside" of its range?

本文关键字:outside 范围 数组元素 访问 为什么      更新时间:2023-10-16

我有一个奇怪的困境。在过去的几周里,我一直在用C/C++处理动态创建的数组和指针运算,发现它非常有趣。然而,我注意到了一些"糟糕"的事情,我有点害怕。这是我的代码:

#include <iostream>
#include <cstdlib>
using namespace std;
int main() {
    int *A = (int*) malloc(sizeof(int)*5);
    int B[5] = {0,1,2,3,4};
    A[0] = 0;
    A[1] = 1;
    A[2] = 2;
    A[3] = 3;
    A[4] = 4;
    A[5] = 5;
    A[12] = 12;
    //A[1000] = 1000;
    cout << "A[0] = " << A[0] << ", A[1] = " << A[1] << endl;
    cout << "A[2] = " << A[2] << ", A[3] = " << A[3] << endl;
    cout << "A[4] = " << A[4] << endl;
    cout << "A[12] = " << A[12] << ", A[5] =  " << A[5] << endl;
    cout << "A[1000] = " << A[1000] << endl;
    cout << "*(A+5) = " << *(A+5) << endl;
    B[5] = 5;
    cout << "B[5] = " << B[5] << endl;
    cout << "*(B+5) = " << *(B+5) << endl;
    /**********************************/
    return 0;
}

请注意,这段代码不是按时间顺序编写的,而是随着时间的推移进行编辑的。

无论如何,代码编译得很好,我得到了以下输出:

A[0] = 0, A[1] = 1
A[2] = 2, A[3] = 3
A[4] = 4
A[12] = 12, A[5] =  5
A[1000] = 0
*(A+5) = 5
B[5] = 5
*(B+5) = 5

难道A和B不应该只能保持5个值吗?还是我所做的非常危险?如果A[2000]是一段敏感的内存,如何阻止它被篡改?这是一个实际的问题吗?如果是,C++对这种情况有任何预先警告吗?

在数组边界之外访问数组是未定义的行为,这意味着任何事情都可能发生,甚至什么都不会发生。你可能正在读取一些被禁止的内存并导致"访问违规",也可能正在读取你的一些其他变量或其他人留下的一些古老数据,这取决于你的数组在内存中的位置以及你偏离了多远。

在C和C++中,没有运行时边界检查,这允许您在下标中放入任何数字,事实上,您将访问如下所示的地址:(第一个元素的地址)+sizeof(类型)*下标