【问题标题】:What does "new int * **[10]" do?“new int * **[10]”有什么作用?
【发布时间】:2019-01-11 07:25:06
【问题描述】:

我在某处看到以下代码,我有点困惑。

int****            m_ppppCoder;
m_ppppCoder = new int ***[10];

这是一个动态分配的 3 维 int 数组吗?有人能准确解释一下,它是如何工作的吗?

阅读cmets后补充:上面的声明本身并不是一个完整的3d int数组,而是数组创建第一步的声明结构。据此,使用下面的代码,您可以动态创建一个 3d 数组。对吗?

m_ppppCoder[0] = new int **[10];
m_ppppCoder[0][0] = new int *[10];
m_ppppCoder[0][0][0] = new int[10];

在这种情况下,实际的数据如何在内存中按顺序排列(分配)?

【问题讨论】:

  • 这表明你应该远离这样的代码。
  • FWIW,代码创建了一个包含 10 个指针的数组。每个指针的类型是int***。这可能是一些多维数组的开始,但目前它只是一个指针数组。
  • 它有什么作用?它让任何理智的程序员头晕目眩
  • 如果你有5分钟的空闲时间,我刚刚为你录制了a video answer

标签: c++ arrays memory memory-management new-operator


【解决方案1】:

这是一个动态分配的 3 维 int 数组吗?

没有。

int****            m_ppppCoder

m_ppppCoder是一个指向指针的指针,指向一个指向整数的指针。

m_ppppCoder = new int * **[10];

m_ppppCoder 指向一个动态分配的数组的第一个元素,该数组由 10 个指针指向一个指向整数的指针。

有人能准确解释一下,它是如何工作的吗?

嗯,它是一个指向数组元素的指针,所以它本身不会做很多工作。使用示例:

int i = 42;                 // an integer i
int *ii = &i;               // ii points to i
int **iii = ⅈ            // iii points to ii
m_ppppCoder[0] = &iii;      // the first element points to iii
int j = ****m_ppppCoder[0]; // the value of j is now 42
delete[] m_ppppCoder;       // never forget to delete dynamic memory

int**** 可能没有很好的实际用途。


m_ppppCoder = new int ***[10];
m_ppppCoder[0] = new int **[10];
m_ppppCoder[0][0] = new int *[10];
m_ppppCoder[0][0][0] = new int[10];

在这种情况下,实际的数据如何在内存中按顺序排列(分配)?

像这样:

pointer to int***     p
                      |
an array of 10 int*** |->[0][1][2][3]...
                          |
an array of 10 int**      |->[0][1][2][3]...
                              |
an array of 10 int*           |-> [0][1][2][3]...
                                   |
an array of 10 int                 |-> [0][1][2][3]...

这很简单。您已经分配了 4 个数组。由于它们是单独的分配,因此这 4 个数组中的每一个都彼此分开,位于空闲存储区的某个位置。

数组的元素本身在内存中是连续的。因此,每个指针(或最后一个的整数)在内存中相对于同一数组的其他元素是连续的。

请注意,m_ppppCoder[x]m_ppppCoder[0][x]m_ppppCoder[0][0][x] 是 [1, 10) 中所有 x 的未初始化指针。

【讨论】:

  • @Borgleader 这句话也可能是错误的。任何人,我都会很感激评论:)
  • 感谢您的回答!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-23
  • 2019-08-14
  • 2018-02-25
  • 2021-12-30
  • 1970-01-01
  • 2017-10-17
  • 2020-01-28
相关资源
最近更新 更多