天天看點

[C/C++基礎知識] 面試再談struct和union大小問題

        最近找工作參加了很多筆試,其中考察結構體和聯合體的大小問題是經常出現的一個問題。雖然題目簡單而且分值比較低,但是還是想再給大家回顧下這些c和c++的基礎知識。希望文章對你有所幫助~

        ps:意外驚喜第三部分,所有權歸它們公司所有。我隻想分享學習并無它,望海涵~

        1.[2015-9 完美] 在ia32架構下,下面的union結構的sizeof大小為:_______

        題解:

        該題充分考察了結構struct和union聯合的差別:

        聯合與結構的本質差別在于記憶體使用方式的不同。

        結構中不同的成員使用不同的存儲空間,一個結構所占的記憶體大小是結構中每個成員所占記憶體大小的總和,結構體中每個成員互相獨立,是不能占用同一存儲單元的。

        聯合大小取決于其中最大的資料類型記憶體配置設定大小,聯合中記憶體是疊加存放的。

        同一存儲區域由不同類型的變量共享,這種資料類型就是聯合(也稱共同體)。

        故:聯合pagelayout中由struct和dummy[10]兩部分組成,其中結構的大小為int型4位元組+char8位元組,因為它需要位元組對齊為4的整數倍,結構12位元組+dummy字元數組10位元組。

        答案:12

[C/C++基礎知識] 面試再談struct和union大小問題

        2.[2013 完美世界] 求結構st的大小為_______.

        該提醒主要考察結構體中嵌套聯合的大小,原理同上。其中int型為4位元組,short為2位元組,指針相當于無符号的整形4位元組,同時補齊則為實際大小。

       char ch記憶體對齊後為4位元組、char類型指針4位元組、union為4位元組(其中聯合為最大資料類型的記憶體大小,short a 2位元組、short b 2位元組、無符号int4位元組,位域問題見下)、bool型補齊4位元組、struct類型指針4位元組,總共占:4+4+4+4+4=20位元組。

        答案:20

        位域:把一個位元組中的二進制位劃分為幾個不同的區域,并說明每個區域的位數。

        格式:類型說明符 位域名:位域長度,例如 unsigned int c:2表示c在記憶體中占2位

        通過如下程式輸出結構中記憶體位址如下圖所示:

[C/C++基礎知識] 面試再談struct和union大小問題

        3.[變形 完美] 求結構st的大小為_______.

        它與上題的差別聯合聲明a,表示定義的一個類型不用占用記憶體;而如果沒有聲明a,則表示聲明了結構體中的一個成員,需要占記憶體。

        記憶體大小為ch補齊4位元組、char指針4位元組、聯合不占記憶體0位元組、bool型補齊4位元組、結構指針4位元組,輸出16位元組。注意:如果聯合後面添加ui,如 "union a{....}ui;" 此時輸出結果為20。

        答案:16

[C/C++基礎知識] 面試再談struct和union大小問題

        代碼分别如下所示:

        輸出:12

        其中int4位元組+char兩個4位元組補齊

        輸出16

        其中補齊4位元組+int型4位元組+double8位元組,其中為什麼補齊4而不是8呢?思考下~

        輸出:24

        輸出補齊a8位元組+double8位元組+c補齊8位元組

        輸出:4

        聯合4位元組,其中由于聯合各個成員使用共同的存儲區域,當向其中一個成員指派時,聯合中的其他值也會發生變化。

        由于很多題目都要求不能洩露,隻能憑借記憶簡單再分享幾種常見的題型,這些基礎型題目是關于c\c++\資料結構的,任何崗位都可能遇到。因為我個人報的崗位衆多,包括:c++開發、算法工程、nlp、php開發、大資料方向等,但是還是建議:

        "精>>雜   |   專一>>博愛   |   leetcode>>不做"

        這麼多筆試,讓我牢記一點:山外有山,人外有人,尤其是程式猿,自己真心太弱,要學習的東西太多太多;但是什麼時候都不能丢失自我和自己感興趣的東西,即使再累再苦,做自己喜歡的東西就是幸福,比如寫部落格、玩爬蟲、賞美文、學習新知識。即使半夜淩晨,分享一篇部落格或看到好的東西都讓人欣喜,這就是生活吧!

        1.[2015-9 完美] int n=0; while(n=1) n++;  while循環執行的次數是:______.

        答案:無限循環

        因為while(n=1)是個指派語句,表示動作始終為true

        2.[2015-9 完美] 二叉樹後序周遊序列為debfca,中序周遊序列為dbeafc,則前序周遊順序:______.

        提示:e代價也考察了類似題目

        先序表示根->左->右、中序表示左->根->右、後序表示左->右->根。記住先序根在前面,後序根在最後。

        題中後序debfca,顯然a為第一個根節點。前序最先輸出a

        3.[2015-9 完美] 下面程式的輸出是多少:_____.

         答案:19

         這是一道非常基礎的考察宏定義的題目,題目是錯的,應該改為add(a,b)。但顯然不影響其功能,它替換後結果為:5*3+4=19,易錯誤的結果是輸出35。顯然它沒有添加括号。再補充一道2015後端研發美團的類似題目。

         4.[2015-9 美團] 多個源檔案組成c程式,經過編輯、預處理、編譯、連結生成可執行程式,下列哪個可以發現被調用的函數未定義?

        答案:連結

        解析:本題考查的是程式編譯過程的基本知識。對于編譯型程式設計語言c,在程式編寫完成後執行前,主要進行預處理、翻譯為目标代碼和連結庫函數等關鍵步驟。

        在這三步中,預處理分析程式中的宏定義并替換宏引用,翻譯主要針對一個編譯單元(通常對應一個源檔案)進行,将該編譯單元翻譯為中間代碼,連結過程将各個編譯單元中變量和函數的引用與其定義綁定,確定程式中使用的所有變量和函數都存在對應實體。是以,未定義的函數引用隻能在連結過程中發現。

        5.[2015-9 美團] 按入棧序列式abcde,不可能出棧的序列式:_______.

                        decba       dceba         ecdba         abcde

        提示:該題目完美、e代價等公司都有

        答案:ecdba

經典的考察出棧題目:  如果在草稿紙上畫出入棧圖就非常容易了。此時入棧abcd  d => e  c => c  b => b  a => a  出d人e再出cba,出dc入e再出ba,最後是入一個出一個,而e出後必須先d後c,故ecdba錯誤。

       6.二分查找第一輪查找的關鍵字是什麼?快速排序第一輪結果是什麼?堆排序第一輪後的結果是什麼?(多為選擇題)

        7.[2015-9 360] person類執行個體化new一個對象$p,那如何使用對象$p調用person類中的方法:

              a.$p->getinfo()     b.this->getinfo()      c.$p::getinfo()      d.$p=>getinfo()

        提示:php方向

        完美考了面向對象的繼承,不能直接通路基類中繼承的某個成員,通常是私有成員;内斂函數、虛函數等知識。

       8.[2015-9 360] 下列不是動态規劃算法的基本要素?              

              a.馬爾科夫性           b.建表填充        c.子問題疊代        d.最優子結構

       9.[2015-9 360] 下列不要求最優子結構的:              

              a.分治法           b.貪心算法       c.動态規劃        d.回溯法

        提示:貪心算法和動态規劃的共同點就是最優子結構。

       10.[2015-9 360] tcp連接配接socket上調用recv函數,傳回值為0表示:

                     a.對端關閉連接配接

                     b.連接配接錯誤

                     c.對端發送長度為0資料

                     d.還沒收到對端資料

        懷疑:a

        tcp面向連接配接,保證資料安全、三次握手;udp包可能丢失,但速度更快。(完美)

        套接字程式設計send和recv參數也常考。recv的功能是從接收緩沖區讀取(其實就是拷貝)指定長度的資料。recv傳回的條件有兩種:

           (1).

recv函數傳入的應用層接收緩沖區已經讀滿

           (2). 協定層接收到push字段為1的tcp封包,此時recv傳回值為實際接收的資料長度

        e代價有道題目也比較好:

        200-ok 請求成功

        400-bad request 語義有無,目前請求無法被伺服器了解

        403-forbidden 伺服器已經了解請求,但拒絕執行它

        404-not found 請求失敗,請求資源未被伺服器發現

        500-interanl server error 伺服器遇一個未曾預料的狀況,導緻無法完成請求處理

        505-http version not support 伺服器不支援或拒絕在請求中使用http版本

        11.資料庫常考select語句、事務acid

        12.作業系統就是死鎖及解決死鎖方法、程序線程差別、阻塞執行就緒狀态的天下

        最後為什麼說leetcode遠遠大于不做,因為最開始我挺反感a題的,後來實在是後悔a晚了。畢竟不是三年前瘋狂刷題的我,同時很多題目都是看不出bug的;尤其是筆試中很多leetcode題目。包括:

        完美的連結清單轉置reverse、e代價的判斷單連結清單是否存在環(一步兩步問題)、美團的循環n=n&(n-1)計算n二進制中1的個數、360的求素數、阿裡巴巴以對的形式判斷最大堆結合二叉樹、掌趣遊戲二分查找、二叉樹層次周遊(隊列)、安全線性隊列類等。

       總之,希望文章對你有所幫助吧!還是低調點,都不敢釋出出來。噓~

       (by:eastmount

繼續閱讀