[C/C++基础知识] 面试再谈struct和union大小问题
? ? ? ? 最近找工作參加了很多筆試,其中考察結(jié)構(gòu)體和聯(lián)合體的大小問題是經(jīng)常出現(xiàn)的一個問題。雖然題目簡單而且分值比較低,但是還是想再給大家回顧下這些C和C++的基礎(chǔ)知識。希望文章對你有所幫助~
? ? ? ? PS:意外驚喜第三部分,所有權(quán)歸它們公司所有。我只想分享學(xué)習(xí)并無它,望海涵~
?
一. 真題介紹
? ? ? ? 1.[2015-9 完美]?在IA32架構(gòu)下,下面的union結(jié)構(gòu)的sizeof大小為:_______
union PageLayout {struct{int page_index;char key[5];};char dummy[10]; };? ? ? ? 題解:
? ? ? ? 該題充分考察了結(jié)構(gòu)struct和union聯(lián)合的區(qū)別:
? ? ? ? 聯(lián)合與結(jié)構(gòu)的本質(zhì)區(qū)別在于內(nèi)存使用方式的不同。
? ? ? ? 結(jié)構(gòu)中不同的成員使用不同的存儲空間,一個結(jié)構(gòu)所占的內(nèi)存大小是結(jié)構(gòu)中每個成員所占內(nèi)存大小的總和,結(jié)構(gòu)體中每個成員相互獨立,是不能占用同一存儲單元的。
? ? ? ? 聯(lián)合大小取決于其中最大的數(shù)據(jù)類型內(nèi)存分配大小,聯(lián)合中內(nèi)存是疊加存放的。
? ? ? ? 同一存儲區(qū)域由不同類型的變量共享,這種數(shù)據(jù)類型就是聯(lián)合(也稱共同體)。
? ? ? ? 故:聯(lián)合PageLayout中由struct和dummy[10]兩部分組成,其中結(jié)構(gòu)的大小為int型4字節(jié)+char8字節(jié),因為它需要字節(jié)對齊為4的整數(shù)倍,結(jié)構(gòu)12字節(jié)+dummy字符數(shù)組10字節(jié)。
? ? ? ? 答案:12
?
? ? ? ??
? ? ? ? 2.[2013 完美世界]?求結(jié)構(gòu)st的大小為_______.
struct st {char ch,*ptr;union{short a,b;unsigned int c:2,d:1;};bool f;struct st *next; };?
? ? ? ? 題解:
? ? ? ? 該提醒主要考察結(jié)構(gòu)體中嵌套聯(lián)合的大小,原理同上。其中int型為4字節(jié),short為2字節(jié),指針相當(dāng)于無符號的整形4字節(jié),同時補齊則為實際大小。
? ? ? ?char ch內(nèi)存對齊后為4字節(jié)、char類型指針4字節(jié)、union為4字節(jié)(其中聯(lián)合為最大數(shù)據(jù)類型的內(nèi)存大小,short a 2字節(jié)、short b 2字節(jié)、無符號Int4字節(jié),位域問題見下)、bool型補齊4字節(jié)、struct類型指針4字節(jié),總共占:4+4+4+4+4=20字節(jié)。
? ? ? ? 答案:20
? ? ? ? 位域:把一個字節(jié)中的二進制位劃分為幾個不同的區(qū)域,并說明每個區(qū)域的位數(shù)。
? ? ? ? 格式:類型說明符 位域名:位域長度,例如 unsigned int c:2表示c在內(nèi)存中占2位
? ? ? ? 通過如下程序輸出結(jié)構(gòu)中內(nèi)存地址如下圖所示:
?
? ? ? ? 3.[變形 完美]?求結(jié)構(gòu)st的大小為_______.
?
struct st {char ch,*ptr;union A{short a,b;unsigned int c:2,d:1;};bool f;struct st *next; };? ? ? ? 題解:
? ? ? ? 它與上題的區(qū)別聯(lián)合聲明A,表示定義的一個類型不用占用內(nèi)存;而如果沒有聲明A,則表示聲明了結(jié)構(gòu)體中的一個成員,需要占內(nèi)存。
? ? ? ? 內(nèi)存大小為ch補齊4字節(jié)、char指針4字節(jié)、聯(lián)合不占內(nèi)存0字節(jié)、bool型補齊4字節(jié)、結(jié)構(gòu)指針4字節(jié),輸出16字節(jié)。注意:如果聯(lián)合后面添加ui,如 "union A{....}ui;" 此時輸出結(jié)果為20。
? ? ? ? 答案:16
?
?
二. 其他題型
? ? ? ? 代碼分別如下所示:
struct A {int page_index;char key[5]; };? ? ? ? 輸出:12
? ? ? ? 其中int4字節(jié)+char兩個4字節(jié)補齊
?
struct B {char a;int b;double c; };? ? ? ? 輸出16
? ? ? ? 其中補齊4字節(jié)+int型4字節(jié)+double8字節(jié),其中為什么補齊4而不是8呢?思考下~
? ? ? ? 輸出:24
? ? ? ? 輸出補齊a8字節(jié)+double8字節(jié)+c補齊8字節(jié)
? ? ? ? 輸出:4
? ? ? ? 聯(lián)合4字節(jié),其中由于聯(lián)合各個成員使用共同的存儲區(qū)域,當(dāng)向其中一個成員賦值時,聯(lián)合中的其他值也會發(fā)生變化。
? ? ? ? 推薦文章:http://blog.chinaunix.net/uid-26943148-id-3196468.html
?
?
?
三. 其他經(jīng)典考題
? ? ? ? 由于很多題目都要求不能泄露,只能憑借記憶簡單再分享幾種常見的題型,這些基礎(chǔ)型題目是關(guān)于C\C++\數(shù)據(jù)結(jié)構(gòu)的,任何崗位都可能遇到。因為我個人報的崗位眾多,包括:C++開發(fā)、算法工程、NLP、PHP開發(fā)、大數(shù)據(jù)方向等,但是還是建議:
? ? ? ? "精>>雜 ? | ? 專一>>博愛 ? | ? LeetCode>>不做"
? ? ? ? 這么多筆試,讓我牢記一點:山外有山,人外有人,尤其是程序猿,自己真心太弱,要學(xué)習(xí)的東西太多太多;但是什么時候都不能丟失自我和自己感興趣的東西,即使再累再苦,做自己喜歡的東西就是幸福,比如寫博客、玩爬蟲、賞美文、學(xué)習(xí)新知識。即使半夜凌晨,分享一篇博客或看到好的東西都讓人欣喜,這就是生活吧!
? ? ? ? 1.[2015-9 完美] int n=0; while(n=1) n++; ?while循環(huán)執(zhí)行的次數(shù)是:______.
? ? ? ? 答案:無限循環(huán)
? ? ? ? 因為while(n=1)是個賦值語句,表示動作始終為true
? ? ? ? 2.[2015-9 完美] 二叉樹后序遍歷序列為DEBFCA,中序遍歷序列為DBEAFC,則前序遍歷順序:______.
? ? ? ? 提示:E代價也考察了類似題目
? ? ? ? 先序表示根->左->右、中序表示左->根->右、后序表示左->右->根。記住先序根在前面,后序根在最后。
? ? ? ? 題中后序DEBFCA,顯然A為第一個根節(jié)點。前序最先輸出A
? ?
? ? ? ? 3.[2015-9 完美] 下面程序的輸出是多少:_____.
? ? ? ? ?答案:19? ? ? ? ?這是一道非常基礎(chǔ)的考察宏定義的題目,題目是錯的,應(yīng)該改為add(a,b)。但顯然不影響其功能,它替換后結(jié)果為:5*3+4=19,易錯誤的結(jié)果是輸出35。顯然它沒有添加括號。再補充一道2015后端研發(fā)美團的類似題目。
? ? ? ? ?4.[2015-9 美團]?多個源文件組成C程序,經(jīng)過編輯、預(yù)處理、編譯、鏈接生成可執(zhí)行程序,下列哪個可以發(fā)現(xiàn)被調(diào)用的函數(shù)未定義?
? ? ? ? 答案:鏈接
? ? ? ? 解析:本題考查的是程序編譯過程的基本知識。對于編譯型程序設(shè)計語言C,在程序編寫完成后執(zhí)行前,主要進行預(yù)處理、翻譯為目標(biāo)代碼和鏈接庫函數(shù)等關(guān)鍵步驟。
? ? ? ? 在這三步中,預(yù)處理分析程序中的宏定義并替換宏引用,翻譯主要針對一個編譯單元(通常對應(yīng)一個源文件)進行,將該編譯單元翻譯為中間代碼,鏈接過程將各個編譯單元中變量和函數(shù)的引用與其定義綁定,確保程序中使用的所有變量和函數(shù)都存在對應(yīng)實體。所以,未定義的函數(shù)引用只能在鏈接過程中發(fā)現(xiàn)。
? ? ? ? 5.[2015-9 美團]?按入棧序列式ABCDE,不可能出棧的序列式:_______.
? ? ? ? ? ? ? ? ? ? ? ? DECBA? ? ? ?DCEBA? ? ? ? ?ECDBA ? ? ? ??ABCDE
?
? ? ? ? 提示:該題目完美、E代價等公司都有
? ? ? ? 答案:ECDBA
?
經(jīng)典的考察出棧題目:?
如果在草稿紙上畫出入棧圖就非常容易了。此時入棧ABCD?
D => E?
C => C?
B => B?
A => A?
出D人E再出CBA,出DC入E再出BA,最后是入一個出一個,而E出后必須先D后C,故ECDBA錯誤。
?
? ? ? ?6.二分查找第一輪查找的關(guān)鍵字是什么?快速排序第一輪結(jié)果是什么?堆排序第一輪后的結(jié)果是什么?(多為選擇題)
? ? ? ? 7.[2015-9 360] Person類實例化new一個對象$p,那如何使用對象$p調(diào)用Person類中的方法:
? ? ? ? ? ? ? A.$p->getInfo() ? ? B.this->getInfo() ? ? ?C.$p::getInfo() ? ? ?D.$p=>getInfo()
? ? ? ? 提示:PHP方向
? ? ? ? 完美考了面向?qū)ο蟮睦^承,不能直接訪問基類中繼承的某個成員,通常是私有成員;內(nèi)斂函數(shù)、虛函數(shù)等知識。
? ? ? ?8.[2015-9 360] 下列不是動態(tài)規(guī)劃算法的基本要素?? ? ? ? ? ? ??
? ? ? ? ? ? ? A.馬爾科夫性? ? ? ? ? ?B.建表填充? ? ? ? C.子問題疊代? ? ? ? D.最優(yōu)子結(jié)構(gòu)
? ? ? ?9.[2015-9 360] 下列不要求最優(yōu)子結(jié)構(gòu)的:? ? ? ? ? ? ??
? ? ? ? ? ? ? A.分治法? ? ? ? ? ?B.貪心算法? ? ? ?C.動態(tài)規(guī)劃? ? ? ? D.回溯法? ? ? ? 提示:貪心算法和動態(tài)規(guī)劃的共同點就是最優(yōu)子結(jié)構(gòu)。
? ? ? ?10.[2015-9 360] TCP連接socket上調(diào)用recv函數(shù),返回值為0表示:
? ? ? ? ? ? ? ? ? ? ?A.對端關(guān)閉連接
? ? ? ? ? ? ? ? ? ? ?B.連接錯誤
? ? ? ? ? ? ? ? ? ? ?C.對端發(fā)送長度為0數(shù)據(jù)
? ? ? ? ? ? ? ? ? ? ?D.還沒收到對端數(shù)據(jù)
? ? ? ? 懷疑:A
? ? ? ? TCP面向連接,保證數(shù)據(jù)安全、三次握手;UDP包可能丟失,但速度更快。(完美)
? ? ? ? 套接字編程send和recv參數(shù)也常考。recv的功能是從接收緩沖區(qū)讀取(其實就是拷貝)指定長度的數(shù)據(jù)。recv返回的條件有兩種:
? ? ? ? ? ?(1). recv函數(shù)傳入的應(yīng)用層接收緩沖區(qū)已經(jīng)讀滿
? ? ? ? ? ?(2). 協(xié)議層接收到push字段為1的TCP報文,此時recv返回值為實際接收的數(shù)據(jù)長度
? ? ? ?客戶端的程序連接上服務(wù)器后recv函數(shù)阻塞接受,有時會返回0,說明接收超時服務(wù)器主動斷開了連接,需要重新connect服務(wù)器。參考
? ? ? ? E代價有道題目也比較好:
? ? ? ? 200-OK 請求成功
? ? ? ? 400-Bad Request 語義有無,當(dāng)前請求無法被服務(wù)器理解
? ? ? ? 403-Forbidden 服務(wù)器已經(jīng)理解請求,但拒絕執(zhí)行它
? ? ? ? 404-Not Found 請求失敗,請求資源未被服務(wù)器發(fā)現(xiàn)
? ? ? ? 500-Interanl Server Error 服務(wù)器遇一個未曾預(yù)料的狀況,導(dǎo)致無法完成請求處理
? ? ? ? 505-HTTP Version Not Support 服務(wù)器不支持或拒絕在請求中使用HTTP版本
? ? ? ? 11.數(shù)據(jù)庫常考select語句、事務(wù)ACID
? ? ? ? 12.操作系統(tǒng)就是死鎖及解決死鎖方法、進程線程區(qū)別、阻塞執(zhí)行就緒狀態(tài)的天下
? ? ? ? 最后為什么說leetcode遠遠大于不做,因為最開始我挺反感A題的,后來實在是后悔A晚了。畢竟不是三年前瘋狂刷題的我,同時很多題目都是看不出BUG的;尤其是筆試中很多Leetcode題目。包括:
? ? ? ? 完美的鏈表轉(zhuǎn)置Reverse、E代價的判斷單鏈表是否存在環(huán)(一步兩步問題)、美團的循環(huán)n=n&(n-1)計算n二進制中1的個數(shù)、360的求素數(shù)、阿里巴巴以對的形式判斷最大堆結(jié)合二叉樹、掌趣游戲二分查找、二叉樹層次遍歷(隊列)、安全線性隊列類等。
? ? ? ?總之,希望文章對你有所幫助吧!還是低調(diào)點,都不敢發(fā)布出來。噓~
? ? ? ?(By:Eastmount 2015-9-23 凌晨4點???http://blog.csdn.net/eastmount/)
?
?
?
總結(jié)
以上是生活随笔為你收集整理的[C/C++基础知识] 面试再谈struct和union大小问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [LeetCode] Count Pri
- 下一篇: [LeetCode] Palindrom