【发布时间】:2020-08-15 09:01:21
【问题描述】:
谁能解释一下c++的指针数组是如何动态实现的?
下面的代码正确吗?
如果是这样,
int *ptr[5];
for (int i = 0; i < 5; i++)
{
int size = 2;
ptr[i] = new int [size] ;
//*(ptr + i) = new int[size]; this is the same as above line
cout << &ptr[i] << endl; ----------> line 1
cout << ptr[i] << endl; -----------> line 2
}
第 1 行和第 2 行实际打印的是什么?
这是我在第 1 行得到的地址
0x7fff88f805d0
0x7fff88f805d8
0x7fff88f805e0
0x7fff88f805e8
0x7fff88f805f0
这是我在第 2 行得到的地址
0x55f946348ef0
0x55f946349330
0x55f946349360
0x55f946349390
0x55f9463493c0
有人能解释一下这堆指针数组吗?
【问题讨论】:
-
每个数组中的元素在这两种情况下似乎都是等距的。你认为
78与十六进制的80相差多远? -
int *ptr[i] = new int[10];no... 你声明int *ptr [5];(五个指针),在你的循环中你想要ptr[i] = new int[10];,[..]本身就是一个取消引用,例如*(ptr + i). -
嗯,地址似乎暗示了这些项目是按某种顺序分配的。但是,它们更有可能是随机的并且来自随机存储器。在您的情况下,该程序是“新鲜的”,因此它们似乎有订单,但实际上,每个“新”都可能返回与任何其他“新”无关的东西。大小不完全匹配,因为“新”在分配和取消分配项目时有自己的开销。此外,一些编译器需要担心对齐问题,这会再次混淆选择特定地址的原因及其表观大小。
-
@cigien,我明白了,感谢您指出十六进制混淆,我编辑了问题。你能向我解释一下什么地址吗,我在编辑后的问题的第 2 行。这是什么意思?
标签: c++ arrays oop pointers memory-address