为什么我能够访问数组元素"外部"它的范围?

时间:2015-06-23 18:12:53

标签: c++ arrays pointer-arithmetic

我有一种奇怪的困境。在过去的几周里,我一直在使用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 ++是否对此情况有任何预防措施?

1 个答案:

答案 0 :(得分:0)

从它的边界访问数组是未定义的行为,这意味着任何事情都可能发生,甚至一无所获。 您可能正在阅读一些被禁止的内存并导致访问违规行为&#34;或者你可能正在读一些其他变量或一些古老的数据,这些数据是由其他人一直留在那里的,这取决于你的阵列在记忆中的位置以及你走了多远。

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