【问题标题】:Pointers, Arrays and the new Operator指针、数组和新的运算符
【发布时间】:2014-07-09 07:47:36
【问题描述】:
int (*ptr)[3]=new int [1][3];

我知道 int (*ptr)[3] 创建了一个指向 3 元素整数保存数组的指针。 我知道 new int [1][3] 动态分配一些大小为 1 行 x 3 列 x 4 字节(32 位机器)= 12 字节的内存。 我也明白 ptr [0] = &ptr [0] 在这种情况下。

  1. 此处分配的总内存为 3 * 12 字节。为什么?
  2. 为什么 LHS 上的 3 依赖于 RHS 上的 3?如果我们在 RHS 上使用 3,我们必须在 LHS 上使用 3。我不能使用 2 或 4。

也许这是一个微不足道的逻辑,但我似乎没有找到这方面的好文献。

【问题讨论】:

  • 1.你从哪里得到这个号码的? 2.意思不明确。你说的是哪种依赖?
  • 你怎么知道它是 3 * 12 字节?
  • @n.m. 1. 我检查了与ptr [0]、ptr [1]和ptr [2]中的每一个相关联的内存地址,它们都相隔12个字节。所以 12 个字节 * 3 个这样的块。 2. 依赖关系:如果我们在 RHS 上使用 3,我们必须在 LHS 上使用 3。我不能使用 2 或 4。我无法想象这里分配了什么。 (编辑问题)
  • 1.没有ptr[1]。你只分配了一个大小为 1 的数组,所以你只能访问ptr[0]。当然还有ptr[0][0]ptr[0][1]ptr[0][2]
  • 我试图在 GCC 上检查这个。当我打印 ptr[0]、ptr[1] 和 ptr[2] 的值时,我得到了有效的结果。它们与 &ptr[0]、&ptr[1] 和 &ptr[2] 相同。有什么理由让我弄错了吗?

标签: c++ arrays pointers new-operator dynamic-memory-allocation


【解决方案1】:

首先,分配的总内存不是 3*12 字节。它是 3*1*sizeof(int) + k 字节,其中 k 未指定(但在 大多数实现,在分配数组时将为 0 int)。

其次,两个3 必须相等,因为它们是 类型。在左侧,类型是“指向 3 int 的指针”。在 对,您正在分配一个“1 个 3 个 int 数组的数组”; 由于数组 new 的语义, 表达式为point to array of 3 int(以及任何信息 关于它是int[1][3]还是int[2][3]或者其他 已经丢失)。 C++ 使用静态类型检查(对于大多数 部分),所以编译器必须知道类型的所有部分 编译时间。

【讨论】:

  • @4aRkKn1gh7 因为标准是这样说的:-)。标准是这样说的,因为编译器通常必须在某处记住元素的数量,以便调用正确数量的析构函数。因此,如果分配的类型具有平凡的析构函数,它将是0,如果它具有非平凡的析构函数,则它的值大于0
  • 嘿@JamesKanze,感谢您的回复。您能否进一步说明:“由于数组 new 的语义,表达式的类型指向 3 个 int 数组(以及有关它是 int[1][3] 还是 int[2][ 的任何信息3] 或任何丢失的东西)。”我同意在这两种情况下 - [1][3] 和 [2][3],占用的内存地址保持不变。另外,3 * 1 * sizeof(int)+ k中的'1'是什么?如果是第一个索引,为什么索引改变时它不会改变?
  • @DMehta 没有什么需要澄清的:标准说如果new分配的类型是“T的数组”,不管T或元素的数量,表达式的类型是“指向T的指针”,指向第一个元素(并且丢失了元素的数量)。这里唯一特别的是T 本身就是一个数组(array[3] of int)。至于3 * 1 * sizeof(int)中的1,就是你的表达式new int[1][3]中的1。如果你写new int[2][3],那么当然会变成2
【解决方案2】:

鉴于您目前提供的信息,我只能回答您问题的第二部分:

Why is the 3 on the LHS dependent on the 3 on the RHS?

int (*ptr)[3] // creates a pointer to an array of 3 ints

这意味着你的变量 ptr 应该指向一个长度为三的数组的数组,当你写 new int [1][3] 时,你实际上是在创建一个长度为三的数组,只有一行(二维数组)。类似地,new int [2][3] 会为您提供一个由两行组成的数组。(二维数组)这就是为什么这两个数组相互依赖。

【讨论】:

  • 它们都是二维数组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-26
  • 1970-01-01
  • 1970-01-01
  • 2015-10-21
  • 1970-01-01
相关资源
最近更新 更多