0

如果我这样做有什么区别

  int *i = new int;
  *i = 5;
  *(i+1) = 20;

  int *i2 = new int [2];
  i2[0] = 5;
  i2[1] = 20;

我可以以相同的方式访问和使用这两个指针,但是这两个示例之间有什么区别,如果我没有分配足够的内存,会发生什么错误,如第一个示例所示?

4

5 回答 5

2

不同之处在于第一个调用未定义的行为。任何事情都可能发生,包括程序崩溃、数据损坏,甚至只是“工作”。

于 2012-05-18T11:52:06.740 回答
2

第一个选项写入尚未分配的内存。这可能会导致不可预知的行为,例如崩溃。

于 2012-05-18T11:53:28.897 回答
0

在第一种情况下,我们为一个整数分配了内存。所以我们不能做 *(i+1) 它将移动到下一个具有未定义行为的位置,即它可能会立即或稍后崩溃。

在后一种情况下,我们为两个整数分配内存。

于 2012-05-18T11:54:33.010 回答
0

最可能的事情是数据损坏,但通常它是未定义的。

于 2012-05-18T11:54:58.957 回答
0

您访问的元素没有区别。语法*(i+1)(指针表示法)和i[1](数组元素访问表示法)是相同的。在这种情况下,您可以将指针和数组视为等效(因此访问同一元素的两种方式)

正如其他人所提到的,如果您(尝试)访问未正确分配的内存,您将有未定义的行为。

于 2012-05-18T11:57:29.637 回答