當前位置:網站首頁>c語言進程(c的常見面試題與陷阱題)

c語言進程(c的常見面試題與陷阱題)

2022-01-28 01:22:28 蘇某的橡皮擦

面試題1.0

 問:該試題的答案是什麼?並說出這個結果的原因。

答案:無限循環打印“ hehe ”。

這是很常見的一道面試題,考得不難且考點只有一個。就是關於數組越界。

1. 首先在內存中創建空間是從高地址到低地址的,這稱為壓棧。而在vs2019,vs2013等環境之下,壓棧創建的空間是隔開兩塊內存(int類型)的。

2.那麼當訪問的到a[12]的時候,a[12] = i = 0;即 i 重新被賦值為0。那麼將死循環打印hehe。

3.類似的在gcc環境下壓棧空出一塊內存(4個字節),vc6.0則沒有空

解决辦法:

最好的辦法就是不要寫出越界的代碼。其二就是先創建數組,再創建i,這樣數組從低到高循環就不會訪問到 i 所在的地址(debug版本下)。release版本下會自動被優化成先創建數組。

回答話術:原因局部變量在內存中創建是由高地址到地址值創建的,而數組的下標的增長在內存中是低到高增長的。
那麼i在內存中就會在數組的上方。如果i和arr數組中間留的空間合適的話那麼數組越界訪問就可能訪問到i。
那麼對i的賦值0就會導致數組進入死循環。
 

陷阱題1.0(sizeof算術轉換陷阱)

問:答案是什麼?為什麼?

答案: i > sizeof( i )

考點:算術轉換(在為int類型以上的變量進行運算時。低級類型將會轉換為高類型再進行運算)

 解析:

由於sizeof的返回類型是size_t,他的本質是unsigned類型。而unsigned int 的級別比int級別要高。那麼當他們運算時就會進行算術轉換。-1 = 4294967295(32比特下的無符號)。sizeof(i) = sizeof(int) = 4。所以 i > sizeof( i )。

算術轉換等級:

以上是本章的全部內容,均是本人的一些淺薄見解

自己深知自我的知識儲備還比較有限

如有理解不恰當之處,望各比特指正

2021.11.28

版權聲明
本文為[蘇某的橡皮擦]所創,轉載請帶上原文鏈接,感謝
https://cht.chowdera.com/2022/01/202201280122282225.html

隨機推薦