相邻阵列的内存分配

Memory Allocation with Adjacent Arrays

本文关键字:内存 分配 阵列      更新时间:2023-10-16

我在C中摆弄两个数组,试图让其中一个入侵另一个的内存空间。作为初学者,我知道编译器会自动为示例中的数组分配内存空间,但是这些内存地址是如何选择的呢?例如,在下面的代码中(由我的浏览器在 c++.com 网站上编译),数字 [] 和 stealth[] 的地址分别是:

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

您在堆栈上分配的任何变量(联合除外)都将有自己的存储,这是语言的保证。地址部分由编译器选择,但主要由操作系统选择。地址的较高部分(数量因系统而异,但通常至少0x1000)将由操作系统选择,整个较低的部分将取决于编译器。

让数组侵入不同变量占用的空间的唯一方法是,如果您要弄乱指针,并且其中许多操作会导致未定义的行为。