2012-10-17 38 views
2

在此代码:C++究竟是什么新<datatype>(<value>)呢?

int * p = new int(44); 

p被分配在堆和它所指向的值是44; 但现在我也可以做这样的事情:

p[1] = 33; 

没有得到一个错误。我一直以为

int * p = new int(44); 

是说“P被分配在堆上,并指向含有44地址”,但显然它使P A指向整数数组的另一种方式?这个新数组的大小是多少?或者这个结果是不寻常的。

+4

'p [1]'相当于'*(p + 1)'。你(非)幸运,它没有崩溃。你可能会发现[这个问题](http://stackoverflow.com/questions/381542/in-c-arrays-why-is-this-true-a5-5a)一个很好的阅读。 – chris

回答

5

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

+2

关闭。变量“p”被分配在堆栈上。然而,它指向的内存(44)被分配在堆上。 – imallett

+0

绝对正确,@IanMallett。感谢您的更正! –

0
int *p_scalar = new int(5); //allocates an integer, set to 5. 

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

0

在您的例子中,C++语言可以为指针下标运算符的默认实现,看起来在某种程度上类似于这:

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

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

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

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