【问题标题】:What happens to values on the stack that get placed in array on the Heap放在堆上的数组中的堆栈上的值会发生什么
【发布时间】:2019-10-06 05:08:29
【问题描述】:

我想知道如果我在 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;

【问题讨论】:

  • 是的,它们被复制了。我不明白你在问什么? int c = new int(3); 不会编译顺便说一句。
  • 如果你分配给变量,数据被复制。这些变量的位置无关紧要。
  • 一个简单的问题:你能有一个参考数组吗?即对象的地址数组。
  • 你不能有一个引用数组;你可以有一个指针数组。如果愿意,您还可以拥有一个包装引用的对象数组。
  • @rert588 你似乎错过了理解&在用于获取变量地址与声明引用变量或参数时的作用。

标签: c++ arrays pointers heap-memory


【解决方案1】:

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

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

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

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

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

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

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

你不想做的是:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-04
    • 2019-07-24
    • 2010-11-22
    • 2013-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多