我正在摆弄C中的两个数组,试图让其中一个数据入侵另一个数据库的内存空间。作为初学者,我理解编译器在我的示例中自动为数组分配内存空间,但是如何选择这些内存地址?例如,在下面的代码中(由我的浏览器在c ++。com网站上编译),数字[]和隐身[]的地址分别为:
0x75fbb51092c0
0x75fbb51092b0
我计算的相隔16个字节。这是一个安全措施,以便一个阵列不进入另一个阵列吗?
// more pointers
#include <iostream>
using namespace std;
int main ()
{
int numbers[5];
int stealth[1];
for (int i=0;i<6;i++){
if (i==0){
stealth[i]=9;
}
else {
numbers[i]=i;
}
}
int * a;
// b=numbers;
a=numbers;
cout << "value at 0 index for numbers: "<< *a << endl;
cout << "address: " << a << endl;
a=stealth;
cout << "value at 0 index for stealth: "<< *a << endl;
cout << "address: " << a << endl;
return 0;
}
++++ 编辑 ++++ 感谢您的输入。经过一些进一步的测试后,我将指向数组的指针设置为整数的位置。然后我遍历数组并在每个索引值处打印出内存地址。然而,数组开头的索引具有与先前设置为整数的地址不同的地址。有什么想法吗?我在下面粘贴了新代码和输出:
// more pointers
#include <iostream>
#include <string>
using namespace std;
int main ()
{
int numbers[5]={1,2,3,4,5};
int alien=6;
int * a;
int * b;
b=numbers;
a=&alien;
b=a;
cout << "address of start of array numbers: " << b << endl;
cout << "address of alien: " << a << endl;
for (int i=0;i<5;i++){
cout << &numbers[i] << endl;
cout << numbers[i] << endl;
}
return 0;
}
输出
address of start of array numbers: 0x79ab503a591c
address of alien: 0x79ab503a591c
0x79ab503a5920
1
0x79ab503a5924
2
0x79ab503a5928
3
0x79ab503a592c
4
0x79ab503a5930
5
答案 0 :(得分:1)
您在堆栈上分配的任何变量(除了联合)都将拥有自己的存储,这是该语言的保证。地址部分由编译器选择,但主要由操作系统选择。地址的较高部分(数量因系统而异,但通常至少为0x1000)将由OS选择,整个较低的部分将取决于编译器。
获取数组以侵入不同变量占用的空间的唯一方法是,如果你要乱用指针,那么许多操作都会导致未定义的行为。