如果我这样做有什么区别
int *i = new int;
*i = 5;
*(i+1) = 20;
和
int *i2 = new int [2];
i2[0] = 5;
i2[1] = 20;
我可以以相同的方式访问和使用这两个指针,但是这两个示例之间有什么区别,如果我没有分配足够的内存,会发生什么错误,如第一个示例所示?
不同之处在于第一个调用未定义的行为。任何事情都可能发生,包括程序崩溃、数据损坏,甚至只是“工作”。
第一个选项写入尚未分配的内存。这可能会导致不可预知的行为,例如崩溃。
在第一种情况下,我们为一个整数分配了内存。所以我们不能做 *(i+1) 它将移动到下一个具有未定义行为的位置,即它可能会立即或稍后崩溃。
在后一种情况下,我们为两个整数分配内存。
最可能的事情是数据损坏,但通常它是未定义的。
您访问的元素没有区别。语法*(i+1)
(指针表示法)和i[1]
(数组元素访问表示法)是相同的。在这种情况下,您可以将指针和数组视为等效(因此访问同一元素的两种方式)
正如其他人所提到的,如果您(尝试)访问未正确分配的内存,您将有未定义的行为。