c++ - 放在堆上的数组中的堆栈上的值会发生什么
问题描述
我想知道我是否在 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 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;
现在,您的数组指向堆栈上的内存位置。只要你在那个函数中就可以正常工作,但是一旦你退出函数并且堆栈被回收,就会指向垃圾。
推荐阅读
- sql - ORA-01858 找不到在哪里
- c# - 从本地计算机将外部 DLL 加载到 Blazor
- javascript - DiscordAPIError:在创建公会时尝试发送邀请时出现未知频道
- php - 安全扫描说利用标头注入有效载荷,但我不直接执行这个http标头的内容?
- java - 如何使用 apache poi 使用 xssf 创建数据透视表?
- java - 如何从 IgniteCache 获取某种类型的所有条目的数量?
- azure-cosmosdb - UpsertItemAsync 在 .NET Cosmos DB 客户端中有什么作用?
- python - Python 记录器 - NFS 的错误
- elasticsearch - Kafka 连接器 Elasticsearch topics.regex
- go - 确保一次只处理一个请求,而丢弃其他传入的请求