为什么我能够访问其范围内的数组元素 "outside"?
Why am I able to access array elements "outside" of its range?
我有一种奇怪的困境。在过去的几周里,我一直在 C/C++ 中使用动态创建的数组和指针算法,并且发现它非常有趣。但是,我注意到一些让我有点害怕的事情 "bad"。这是我的代码:
#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++ 是否对这种情况有任何预防措施?
越界访问数组是未定义的行为,这意味着任何事情都可能发生,甚至什么都没有发生。
您可能正在读取一些禁止的内存并导致 "Access violation" 或者您可能正在读取您的一些其他变量或一些早已离开的其他人留下的古老数据,这取决于您的数组在内存中的位置和你走了多远。
在 C 和 C++ 中没有 运行 时间边界检查,这允许您在下标中放置任何数字,实际上您将访问如下所示的地址:(第一个元素的地址)+ sizeof(类型)*下标
我有一种奇怪的困境。在过去的几周里,我一直在 C/C++ 中使用动态创建的数组和指针算法,并且发现它非常有趣。但是,我注意到一些让我有点害怕的事情 "bad"。这是我的代码:
#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++ 是否对这种情况有任何预防措施?
越界访问数组是未定义的行为,这意味着任何事情都可能发生,甚至什么都没有发生。 您可能正在读取一些禁止的内存并导致 "Access violation" 或者您可能正在读取您的一些其他变量或一些早已离开的其他人留下的古老数据,这取决于您的数组在内存中的位置和你走了多远。
在 C 和 C++ 中没有 运行 时间边界检查,这允许您在下标中放置任何数字,实际上您将访问如下所示的地址:(第一个元素的地址)+ sizeof(类型)*下标