在此代码:C++究竟是什么新<datatype>(<value>)呢?
int * p = new int(44);
p被分配在堆和它所指向的值是44; 但现在我也可以做这样的事情:
p[1] = 33;
没有得到一个错误。我一直以为
int * p = new int(44);
是说“P被分配在堆上,并指向含有44地址”,但显然它使P A指向整数数组的另一种方式?这个新数组的大小是多少?或者这个结果是不寻常的。
在此代码:C++究竟是什么新<datatype>(<value>)呢?
int * p = new int(44);
p被分配在堆和它所指向的值是44; 但现在我也可以做这样的事情:
p[1] = 33;
没有得到一个错误。我一直以为
int * p = new int(44);
是说“P被分配在堆上,并指向含有44地址”,但显然它使P A指向整数数组的另一种方式?这个新数组的大小是多少?或者这个结果是不寻常的。
你说得对:P分配在堆上,并指向一个包含44的地址。没有数组分配。 p[1] = 33;
就是他们所说的“未定义的行为”。您的程序可能会崩溃,但不能保证每次执行此操作时都会崩溃。
关闭。变量“p”被分配在堆栈上。然而,它指向的内存(44)被分配在堆上。 – imallett
绝对正确,@IanMallett。感谢您的更正! –
int *p_scalar = new int(5); //allocates an integer, set to 5.
如果访问p_scalar [N](N <> 0),它可能会崩溃
在您的例子中,C++语言可以为指针下标运算符的默认实现,看起来在某种程度上类似于这:
(*Ptr)& operator[](size_t index)
{
return *(address + index*sizeof(*Ptr));
}
这总是可以重载和替换任何类型。整数也不例外,当您说:
int * pointer = alocate_int_array();
pointer[1] = 1;
您正在使用该运算符的编译器扩充的默认实现。
'p [1]'相当于'*(p + 1)'。你(非)幸运,它没有崩溃。你可能会发现[这个问题](http://stackoverflow.com/questions/381542/in-c-arrays-why-is-this-true-a5-5a)一个很好的阅读。 – chris