C++ 指针增量情况下的行为。C++;

C++ 指针增量情况下的行为。C++;,c++,pointers,dereference,C++,Pointers,Dereference,考虑以下代码: int main() { int* p = new int(3); p+=4; std::cout<<*p<<std::endl; } intmain() { int*p=新的int(3); p+=4; std::cout您正在访问超出范围的内存(分配给单个int对象)。该行为未定义,即不可推断。该程序不应被视为合法的,尽管在语法上是有效的 那么我们能不能推断出输出,这个代码合法吗 指针以其指向的类型大小的倍数递增。当您向p添加4

考虑以下代码:

int main()
{
    int* p = new int(3);
    p+=4;
    std::cout<<*p<<std::endl;
}
intmain()
{
int*p=新的int(3);
p+=4;
std::cout您正在访问超出范围的内存(分配给单个
int
对象)。该行为未定义,即不可推断。该程序不应被视为合法的,尽管在语法上是有效的

那么我们能不能推断出输出,这个代码合法吗

指针以其指向的类型大小的倍数递增。当您向
p
添加4时,您添加的是
4*sizeof(int)
,而不仅仅是4个字节

如果您试图使
p
指向“下一个”整数,请将其递增1,而不是4。否则,
p
将指向超出您分配的末尾的内存

事实上,如果我没有弄错的话,您的分配只创建一个值为3的
int
,而不是三个独立的
int
s:

int* p = new int(3);

试着注释掉
p+=4;
行,你应该得到“3”作为输出。考虑到这一点,juanchopanza上面的答案是正确的。

你超出了你分配的单个整数的界限。取消引用你不拥有的内存会导致未定义的行为,这会使你的整个程序格式不正确。不,不新的
代码,即使使用
p+=1;