下面是道微软的C语言笔试题及其分析过程,但仍有不明白的地方,望高手指点。题目: struct S { int i; int * p; };
void main() { struct S s; int * p = &s.i;
p[0] = 4; p[1] = 3;
s.p = p;
s.p[1] = 1; s.p[0] = 2; }
问程序会在哪一行死掉。 答案:程序执行最后一句s.p[0] = 2死掉。
分析:下面是逐条分析
struct S s; (1) int * p = &s.i;/*取成员s.i的地址*/
(2) p[0] = 4;;/*设置成员s.i为4。因为指针p指向i地址,p[0]指向i*/ (3) p[1] = 3;/*设置成员s.p为3。因为p[0]指向s.i,p[1]指向指针s.p*/ (4) s.p = p;/*重新设置指针s.p为s.i的地址*/ (5) s.p[1] = 1;/*置s.p指针为1。因前面s.p指向s.i的地址,固s.p[1]指向s.p*/ (6) s.p[0] = 2;/*因为s.p指针已经通过前面被设置为1,即非法地址,所以s.p[0]想通过s.p去访问s.i显然是非法的。*/
请问(6)中所谓的“非法地址”是什么意思,为什么先设置s.p指针就不行?如果将s.p[1] = 1;与s.p[0] = 2;的位置倒过来,程序还会死吗?
| |