为什么"cout"以错误的顺序打印变量



以下代码:

int main(){
int a;
int b;
int c=0;
int *p;
p=&a;
*p = 10;
*(p+1) = 20;
*(p+2) = 30;
cout << a << " " << b << " " << c << endl;

return 0;
}

给出输出:

30

解释吗?如果c未初始化(int a,b,c;),预期结果为:10 20 30

这是完全未定义的行为。指针算术只允许在单个数组内进行(甚至不允许在结构成员之间进行,尽管有些编译器可能允许后者)。局部变量不构成数组。它们可以在内存中有任意位置。

你假设*(p+1)是b,没有理由总是这样。编译器如何为变量分配内存地址是完全未定义的,并且会根据许多不同的因素而变化很大(在您的示例中,早期初始化变量会改变它)。另一件会改变它的大事是编译器优化)。你真的不应该依赖于相对内存位置。

指针(p+1)不指向整数变量b,指针(p+2)不指向变量c,所以当你计算这些变量时,你得到的是模糊的值。相反,尝试使用数组,因为在初始化数组编译器为数组分配连续内存。但是当你声明变量时连续内存不是由编译器分配的

Int a[3];
Int *p;
p = &a;
*p = 10;
*(p+1) = 20;
*(p+2) = 30;
cout<< a[0] <<a[1] <<a[2] ;

最新更新