在此代码中:
int * p = new int(44);
p在堆上分配,它指向的值是44; 但现在我也可以这样做:
p[1] = 33;
没有收到错误。我一直以为
int * p = new int(44);
只是另一种说法“P在堆上分配并指向包含44的地址”,但显然它使p成为一个int数组的指针?是这个新阵列44的大小?或者这个结果是不寻常的。
答案 0 :(得分:5)
你是对的:P在堆上分配并指向包含44的地址。没有分配数组。 p[1] = 33;
是他们所谓的“未定义行为”。您的程序可能崩溃,但不保证每次执行此操作都会崩溃。
答案 1 :(得分:0)
int *p_scalar = new int(5); //allocates an integer, set to 5.
如果您访问p_scalar [n](n<> 0),它可能会崩溃
答案 2 :(得分:0)
在您的示例中,C ++语言为下标运算符提供了一个默认实现,指针看起来与此类似:
(*Ptr)& operator[](size_t index)
{
return *(address + index*sizeof(*Ptr));
}
这可以随时重载并替换为任何类型。当你说:
时,整数也不例外int * pointer = alocate_int_array();
pointer[1] = 1;
您正在使用该运算符的编译器扩充默认实现。