【问题标题】:How is dynamic memory allocated in two dimensional array?如何在二维数组中分配动态内存?
【发布时间】:2020-08-03 08:10:46
【问题描述】:

试图了解堆中的分配内存但感到困惑
它们有什么区别:

int** p=new int*[n];

对比

int*p=new int[n];

2) 第一行代码 int** p=new int*[n] 这让人很困惑 int*[n] 返回什么和 new int*[n] 返回什么。

【问题讨论】:

  • 不要发送垃圾标签。它与C 标签没有任何共同之处。
  • 一般来说,new T[N] 构造一个大小为 N 的数组,其中每个元素的类型为 T,并返回数组的地址(类型为 T*,等于第一个元素的地址) .所以第一个给你一个指向 int 的指针数组,第二个给你一个 int 数组。
  • 这能回答你的问题吗? How do I declare a 2d array in C++ using new?
  • @churill 抱歉,我的理解不正确。我认为n 是一个变量。它可能只是代表一个修复号。第二个得到int数组的起始地址,decay不是一个合适的词吗?
  • 它不是二维数组,只有指针数组。

标签: c++ memory dynamic new-operator


【解决方案1】:

区别和代码一模一样

int* p = new int[n];

分配int,但是

int** p = new int*[n];

分配int*

您可以分配任何东西(或多或少)。如果你分配T,那么你得到的是一个指向T的指针,即T*

但是指针并没有什么特别之处,它们也可以被分配。所以如果你分配T*(一个指向T的指针)那么你得到的是一个指向T的指针(即T**)。

分配指针是分配二维数组的第一步。二维数组只是一维数组的数组。指针是二维数组中的行(如果你喜欢的话),但列仍然需要分配。

int** array2d = new int*[num_rows]; // allocate the rows
for (int i = 0; i < num_rows; ++i)
     array2d[i] = new int[num_cols]; // allocate the columns for row i

执行此代码后,array2d 是一个动态分配的二维数组,其中包含num_rows 行和num_cols 列。

【讨论】:

  • 那么你不应该在你的答案中使用“二维数组”这个词,因为它是错误和误导的
  • @P__J__ 现在你已经指出了这个问题。有时可以松散地使用术语。
  • 不,不是。根据语言定义,数组是一块连续的内存。我可以memset(array2d, 0, sizeof(array2D)); 但我不能用指针数组来做。它不是二维数组,IT 语言是精确的。
  • @P__J__ 我不同意。上下文才是最重要的。我正在用我希望 OP 能理解的方式回答这个问题。显然,在不同的情况下,我可能会更准确。
【解决方案2】:

第二行代码分配了一个大小为n的int数组,没问题。

第一行没有分配二维数组。它只是分配一个指针数组。如果可以使用 数组指针数组来模拟二维数组

int **p = new int*[n];
for (int i=0; i<n; i++) {
    p[i] = new int[m];
}

它看起来像一个大小为 n*m 的二维数组,在某种意义上你可以使用 p[i][j],除了行不连续。

但请记住:在 C++ 中编码时,总是更喜欢标准容器而不是手动分配。

【讨论】:

  • 不是二维数组!!。它是指针数组,完全不同。
  • @P__J__:是的,这就是为什么我在回答不是二维数组时使用粗体字体的原因。
【解决方案3】:

首先——它不是二维数组。它是一个指针数组。

int** p=new int*[n];

那么你需要通过遍历这个数组来为每一行分配空间。

要创建二维数组,您需要:

int (*x)[n] = new int[n][n]; 

【讨论】:

  • 第二种方法的问题是,n 需要是 C++ 中的编译时间常数。 C 可以使用运行时 n 来做到这一点,但 C++ 不行。
  • @cmaster-reinstatemonica C++ 不支持 VLA,因此两者都必须保持不变。
  • 不。 new &lt;type&gt;[n] 语句中的外部维度可能是动态的,并且几乎在所有情况下都应该是动态的。否则std::vector&lt;&gt; 将无法实现。只有&lt;type&gt; 部分必须在编译时完全知道。
  • new &lt;type&gt;[n] 不被视为 VLA,因为结果是指向类型为 &lt;type&gt;* 的第一个元素的指针,它不再包含动态数组大小。并且因为 new &lt;type&gt;[n] 与动态 n 自从 new 关键字的概念以来就被允许。
【解决方案4】:

可以使用单个指针在 C 中动态分配二维数组。这意味着使用 malloc 分配大小为 rowcolumndataTypeSize 的内存块,并且可以使用指针算法来访问矩阵元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-11
    • 1970-01-01
    • 2014-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多