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