2

在这段代码中:

int * p = new int(44);

p在堆上分配,它指向的值为44;但现在我也可以这样做:

p[1] = 33;

没有错误。我一直以为

int * p = new int(44);

只是另一种说法“P在堆上分配并指向包含44的地址”但显然它使pa指针指向一个int数组?这个新数组的大小是 44 吗?还是这个结果不寻常。

4

3 回答 3

5

你是对的:P 在堆上分配并指向一个包含 44 的地址。没有分配数组。 p[1] = 33;就是他们所说的“未定义行为”。您的程序可能会崩溃,但不能保证每次执行此操作时都会崩溃。

于 2012-10-17T00:22:23.363 回答
0
int *p_scalar = new int(5); //allocates an integer, set to 5.

如果您访问 p_scalar[n] (n <> 0) 它可能会崩溃

于 2012-10-17T00:24:22.067 回答
0

在您的示例中,C++ 语言为您提供了指针的下标运算符的默认实现,看起来与此类似:

(*Ptr)& operator[](size_t index)
{
   return *(address + index*sizeof(*Ptr));
}

对于任何类型,它总是可以重载和替换。整数也不例外,当你说:

int * pointer = alocate_int_array();
pointer[1] = 1;

您正在使用该运算符的编译器增强默认实现。

于 2012-10-17T00:31:10.017 回答