下列程序會在哪一行崩潰?
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 ;
}
這個題真有意思,直接將硬件與軟件(程序的解釋)分開。
第一步:
S s;
即在內存中開闢8個字節的內存來保存s:
第二步:
int *p = &s.i
可以看圖:
第三步:
p[0] = 4;
此處是要知道:p[0]指向的地址,然後內存中這個地址是怎麼解釋的。
p[0] 所指向的地址就是s.i處的地址,且s.i處的地址是int型,所這個地方就是:s.i = 4;沒有問題了!
第四步:
p[1] = 3;
p[1]的解釋是p指向的原始地址+1,即&s.i+1,則p[1]的地址將會是s.p,如下圖:
第六步:
s.p[1] = 1 ;
此處的解釋是:s.p所指內存中所指地址+1處的地址:s.p[1] = &s.i+1 = s.p,那麼將會使s.p出的內存改變:
s.p所指內存將會指向常量1處的地址。
第七步:
s.p[0] = 1 ;
s.p[0]的地址值爲0x1.即內存地址爲0x1處的內存。由於這個內存沒有被分配進來,所以程序運行崩潰