【面试题】
下列C++程序会在哪一行崩溃?
struct S
{
int i;
int *p;
};
main()
{
S s;
int *p=&s.i;
p[0]=4;
p[1]=3;
s.p=p;
s.p[1]=1;
s.p[0]=2;
}
【分析】int *p=&s.i时,一直到p[0]=4,p[1]=3的时候,p始终等于&s.i。
s.p=p 建立了如下的关系:
s.p存了p的值,也即&s.i,s.p[1]相当于*(&s.i+1),即s.i的地址加1.也就是s.p. s.p[1]和s.p其实是同一个地方,所以到s.p[1]=1的时候,就是在为s.p指针变量赋值,
即改变s.p指针的指向,s.p[0]会指向内存地址为1的地方,这显然是一个非法地址,不能写入,
而最后的s.p[0]=2(相当于*s.p=2)是在向s.p指针指向的地址赋值,也就是试图向地址1写入数值,当然就出错了。