[C/C++基础知识] 面试再谈struct和union大小问题
? ? ? ? 最近找工作參加了很多筆試,其中考察結構體和聯合體的大小問題是經常出現的一個問題。雖然題目簡單而且分值比較低,但是還是想再給大家回顧下這些C和C++的基礎知識。希望文章對你有所幫助~
? ? ? ? PS:意外驚喜第三部分,所有權歸它們公司所有。我只想分享學習并無它,望海涵~
?
一. 真題介紹
? ? ? ? 1.[2015-9 完美]?在IA32架構下,下面的union結構的sizeof大小為:_______
union PageLayout {struct{int page_index;char key[5];};char dummy[10]; };? ? ? ? 題解:
? ? ? ? 該題充分考察了結構struct和union聯合的區別:
? ? ? ? 聯合與結構的本質區別在于內存使用方式的不同。
? ? ? ? 結構中不同的成員使用不同的存儲空間,一個結構所占的內存大小是結構中每個成員所占內存大小的總和,結構體中每個成員相互獨立,是不能占用同一存儲單元的。
? ? ? ? 聯合大小取決于其中最大的數據類型內存分配大小,聯合中內存是疊加存放的。
? ? ? ? 同一存儲區域由不同類型的變量共享,這種數據類型就是聯合(也稱共同體)。
? ? ? ? 故:聯合PageLayout中由struct和dummy[10]兩部分組成,其中結構的大小為int型4字節+char8字節,因為它需要字節對齊為4的整數倍,結構12字節+dummy字符數組10字節。
? ? ? ? 答案:12
?
? ? ? ??
? ? ? ? 2.[2013 完美世界]?求結構st的大小為_______.
struct st {char ch,*ptr;union{short a,b;unsigned int c:2,d:1;};bool f;struct st *next; };?
? ? ? ? 題解:
? ? ? ? 該提醒主要考察結構體中嵌套聯合的大小,原理同上。其中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位
? ? ? ? 通過如下程序輸出結構中內存地址如下圖所示:
?
? ? ? ? 3.[變形 完美]?求結構st的大小為_______.
?
struct st {char ch,*ptr;union A{short a,b;unsigned int c:2,d:1;};bool f;struct st *next; };? ? ? ? 題解:
? ? ? ? 它與上題的區別聯合聲明A,表示定義的一個類型不用占用內存;而如果沒有聲明A,則表示聲明了結構體中的一個成員,需要占內存。
? ? ? ? 內存大小為ch補齊4字節、char指針4字節、聯合不占內存0字節、bool型補齊4字節、結構指針4字節,輸出16字節。注意:如果聯合后面添加ui,如 "union A{....}ui;" 此時輸出結果為20。
? ? ? ? 答案:16
?
?
二. 其他題型
? ? ? ? 代碼分別如下所示:
struct A {int page_index;char key[5]; };? ? ? ? 輸出:12
? ? ? ? 其中int4字節+char兩個4字節補齊
?
struct B {char a;int b;double c; };? ? ? ? 輸出16
? ? ? ? 其中補齊4字節+int型4字節+double8字節,其中為什么補齊4而不是8呢?思考下~
? ? ? ? 輸出:24
? ? ? ? 輸出補齊a8字節+double8字節+c補齊8字節
? ? ? ? 輸出:4
? ? ? ? 聯合4字節,其中由于聯合各個成員使用共同的存儲區域,當向其中一個成員賦值時,聯合中的其他值也會發生變化。
? ? ? ? 推薦文章:http://blog.chinaunix.net/uid-26943148-id-3196468.html
?
?
?
三. 其他經典考題
? ? ? ? 由于很多題目都要求不能泄露,只能憑借記憶簡單再分享幾種常見的題型,這些基礎型題目是關于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返回值為實際接收的數據長度
? ? ? ?客戶端的程序連接上服務器后recv函數阻塞接受,有時會返回0,說明接收超時服務器主動斷開了連接,需要重新connect服務器。參考
? ? ? ? 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 2015-9-23 凌晨4點???http://blog.csdn.net/eastmount/)
?
?
?
總結
以上是生活随笔為你收集整理的[C/C++基础知识] 面试再谈struct和union大小问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [LeetCode] Count Pri
- 下一篇: [C/C++基础知识] 一篇就让你彻底搞