首页 > 解决方案 > 放在堆上的数组中的堆栈上的值会发生什么

问题描述

我想知道我是否在 C++ 中的堆上创建了一个数组并将堆栈中的数据分配给数组,究竟会发生什么?数据是否复制到堆上?

代码片段:

int a = 1;
int b = 2;
int *c = new int(3);
int *arr = new int[3];
arr[0] = a;
arr[1] = b;
arr[2] = *c;

标签: c++arrayspointersheap-memory

解决方案


int a = 3; a 的值为 3。 a 的内存地址是 0x345A 或类似的东西。a 在堆栈上。

int *p = &a; 指针 p 被分配了 a 的地址。p 的内存地址是 0x123B 或类似的东西。该内存地址保存值 0x345A,指向3存储该值的位置。指针 p 在堆栈上。

3如果你打印a,你会得到,*p因为它们是从同一个内存位置获取它们的值。

0x345A如果你打印&a,你会得到,p因为 a 的地址是 p 持有的值。

0x123B如果你打印,你会得到,&p因为那是指针 p 的内存位置。

假设 *c 指向堆上的一个整数,您可以将 c 的值(即堆上整数的内存地址)存储在一个数组中。

int *arr = new int[3];
...
arr[2] = c;

你不想做的是:

int foo = 10;
arr[2] = &foo;

现在,您的数组指向堆栈上的内存位置。只要你在那个函数中就可以正常工作,但是一旦你退出函数并且堆栈被回收,就会指向垃圾。


推荐阅读