指针递增时的行为。 C++
Behavior in case of pointer increment. C++
考虑以下代码:
int main()
{
int* p = new int(3);
p+=4;
std::cout<<*p<<std::endl;
}
我的编译器(Visual Studio 2012)打印:-7514522142
int this case.
那么我们能否以某种方式推断出输出以及这段代码是否合法?
您正在越界访问内存(分配给单个 int
对象)。行为是 undefined,即不可推导。尽管在语法上有效,但该程序不应被视为合法。
So can we somehow deduce the output and is this code legal?
指针以其指向的类型大小的倍数递增。当您将 4 添加到 p
时,您将添加 4 * sizeof(int)
,而不仅仅是 4 个字节。
如果您试图使 p
指向 "next" 整数,请将其递增 1,而不是 4。否则,p
将指向超出你分配了什么。
事实上,如果我没记错的话,您的分配只会创建一个值为 3 的 int
,而不是三个单独的 int
:
int* p = new int(3);
尝试注释掉 p += 4;
行,您应该得到“3”作为输出。考虑到这一点,上面 juanchopanza 的回答是正确的。
考虑以下代码:
int main()
{
int* p = new int(3);
p+=4;
std::cout<<*p<<std::endl;
}
我的编译器(Visual Studio 2012)打印:-7514522142
int this case.
那么我们能否以某种方式推断出输出以及这段代码是否合法?
您正在越界访问内存(分配给单个 int
对象)。行为是 undefined,即不可推导。尽管在语法上有效,但该程序不应被视为合法。
So can we somehow deduce the output and is this code legal?
指针以其指向的类型大小的倍数递增。当您将 4 添加到 p
时,您将添加 4 * sizeof(int)
,而不仅仅是 4 个字节。
如果您试图使 p
指向 "next" 整数,请将其递增 1,而不是 4。否则,p
将指向超出你分配了什么。
事实上,如果我没记错的话,您的分配只会创建一个值为 3 的 int
,而不是三个单独的 int
:
int* p = new int(3);
尝试注释掉 p += 4;
行,您应该得到“3”作为输出。考虑到这一点,上面 juanchopanza 的回答是正确的。