【面试题】关于指针

【面试题】

下列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写入数值,当然就出错了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值