一道面試題(c/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 ; 
}

這個題真有意思,直接將硬件與軟件(程序的解釋)分開。

第一步:

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,如下圖:

然後將此3以int型表示的數據放入此處內存。
第五步:
s.p=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處的內存。由於這個內存沒有被分配進來,所以程序運行崩潰

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章