我有一种奇怪的困境。在过去的几周里,我一直在使用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 ++是否对此情况有任何预防措施?
答案 0 :(得分:0)
从它的边界访问数组是未定义的行为,这意味着任何事情都可能发生,甚至一无所获。 您可能正在阅读一些被禁止的内存并导致访问违规行为&#34;或者你可能正在读一些其他变量或一些古老的数据,这些数据是由其他人一直留在那里的,这取决于你的阵列在记忆中的位置以及你走了多远。
在C和C ++中没有运行时边界检查,这允许您在下标中放置任何数字,实际上您将访问表达如下的地址:(地址到第一个元素)+ sizeof(类型)*下标