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;