相邻阵列的内存分配

时间:2018-01-14 05:13:57

标签: c++ arrays

我正在摆弄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

1 个答案:

答案 0 :(得分:1)

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

获取数组以侵入不同变量占用的空间的唯一方法是,如果你要乱用指针,那么许多操作都会导致未定义的行为。