在研究c++面试题的时候,卡在了下面的问题中:
下面代码的输出是什么?
int main()
{
int a[5]={1,2,3,4,5};
int *p=(int*)(&a+1);
cout<<*(a)<<endl;
cout<<&a<<endl;
cout<<&a+1<<endl;
cout<<(*p)<<endl;
cout<<(*p-1)<<endl;
cout<<(*p-3)<<endl;
}
输出是
1
0x16fdff450
0x16fdff464
1
0
-2
我想知道为什么 *p 是 1,有人可以分享这个想法吗?
谢谢!
的解释
int *p=(int*)(&a+1);
程序具有 未定义的行为,因为您正在 类型转换 类型为
int(*)[5]
的指针到 int*
,然后取消引用该结果指针。基本上,您将结果指针视为指向一个整数。
未定义的行为意味着任何事情都可能发生(就 c++ 标准而言,允许发生)包括但不限于给出预期输出的程序。但永远不要依赖(或根据)具有 UB 的程序的输出。该程序可能会崩溃。
int *p=(int*)(&a+1);
是未定义的行为。这是因为 (&a + 1)
有效地将指针从 a 的地址移动了 sizeof(a)
(这就是 +1 的作用)。现在指针指向另一个与 a 大小相同但不是 a 的数组的开头,而不是我们实际上确定是新数组内存的内存位置。因此cout << (*p)
输出1的原因一定是因为1恰好是数组a之后内存地址处的值。