1. 程式人生 > >面試再談struct和union大小問題

面試再談struct和union大小問題

        最近找工作參加了很多筆試,其中考察結構體和聯合體的大小問題是經常出現的一個問題。雖然題目簡單而且分值比較低,但是還是想再給大家回顧下這些C和C++的基礎知識。希望文章對你有所幫助~
        PS:意外驚喜第三部分,所有權歸它們公司所有。我只想分享學習並無它,望海涵~

一. 真題介紹

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

  1. union PageLayout  
  2. {  
  3.     struct
  4.     {  
  5.         int page_index;  
  6.         char key[5];  
  7.     };  
  8.     char dummy[10];  
  9. };  
        題解:
        該題充分考察了結構struct和union聯合的區別:
        聯合與結構的本質區別在於記憶體使用方式的不同。
        結構中不同的成員使用不同的儲存空間,一個結構所佔的記憶體大小是結構中每個成員所佔記憶體大小的總和,結構體中每個成員相互獨立,是不能佔用同一儲存單元的。
        聯合大小取決於其中最大的資料型別記憶體分配大小,聯合中記憶體是疊加存放的。
        同一儲存區域由不同型別的變數共享,這種資料型別就是聯合(也稱共同體)。
        故:聯合PageLayout中由struct和dummy[10]兩部分組成,其中結構的大小為int型4位元組+char8位元組,因為它需要位元組對齊為4的整數倍,結構12位元組+dummy字元陣列10位元組。
        答案:12


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

  1. struct st  
  2. {  
  3.     char ch,*ptr;  
  4.     union
  5.     {  
  6.         short a,b;  
  7.         unsigned int c:2,d:1;  
  8.     };  
  9.     bool f;  
  10.     struct st *next;  
  11. };  
        題解:
        該提醒主要考察結構體中巢狀聯合的大小,原理同上。其中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的大小為_______.

  1. struct st  
  2. {  
  3.     char ch,*ptr;  
  4.     union A  
  5.     {  
  6.         short a,b;  
  7.         unsigned int c:2,d:1;  
  8.     };  
  9.     bool f;  
  10.     struct st *next;  
  11. };  
        題解:
        它與上題的區別聯合宣告A,表示定義的一個型別不用佔用記憶體;而如果沒有宣告A,則表示聲明瞭結構體中的一個成員,需要佔記憶體。
        記憶體大小為ch補齊4位元組、char指標4位元組、聯合不佔記憶體0位元組、bool型補齊4位元組、結構指標4位元組,輸出16位元組。注意:如果聯合後面新增ui,如 "union A{....}ui;" 此時輸出結果為20。
        答案:16




二. 其他題型

        程式碼分別如下所示:

  1. struct A  
  2. {  
  3.     int page_index;  
  4.     char key[5];  
  5. };  
        輸出:12
        其中int4位元組+char兩個4位元組補齊
  1. struct B  
  2. {  
  3.     char a;  
  4.     int b;  
  5.     double c;  
  6. };  
        輸出16
        其中補齊4位元組+int型4位元組+double8位元組,其中為什麼補齊4而不是8呢?思考下~
  1. struct C  
  2. {  
  3.     char a;  
  4.     double c;  
  5.     char b;  
  6. };  
        輸出:24
        輸出補齊a8位元組+double8位元組+c補齊8位元組
  1. union
  2. {  
  3.     long i;  
  4.     int k;  
  5.     char c;  
  6.     char s[4];  
  7. }D;  

三. 其他經典考題

        由於很多題目都要求不能洩露,只能憑藉記憶簡單再分享幾種常見的題型,這些基礎型題目是關於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 完美] 下面程式的輸出是多少:_____.

  1. #define add(a+b) a+b
  2. int main()  
  3. {  
  4.     printf("%d\n",5 * add(3+4));  
  5.     return 0;  
  6. }  
         答案: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/)

相關推薦

面試structunion大小問題

        最近找工作參加了很多筆試,其中考察結構體和聯合體的大小問題是經常出現的一個問題。雖然題目簡單而且分值比較低,但是還是想再給大家回顧下這些C和C++的基礎知識。希望文章對你有所幫助~         PS:意外驚喜第三部分,所有權歸它們公司所有。我只想分享學

structunion大小的計算方法

struct 結構體中的成員可以是不同的資料型別,成員按照定義時的順序依次儲存在連續的記憶體空間。和陣列不一樣的是,結構體的大小不是所有成員大小簡單的相加,需要考慮到系統在儲存結構體變數時的地址對齊問題。看下面這樣的一個結構體:   struct stu1   {   in

structunion大小

結構體預設對齊方式 在預設對齊方式下,結構體成員的記憶體分配滿足下面三個條件 1.第一個成員的地址和結構體的首地址相同,即偏移量為0。 2.結構體每個成員地址相對於結構體首地址的偏移量(offset)是該成員大小的整數倍,如果不是則編譯器會在成員之間新增填

Windows下structunion位元組對齊設定以及大小的確定(一 簡介結構體大小的確定)

在windows下設定位元組對齊大小的方式,目前我瞭解有三種: 1. 在編譯程式時候的編譯選項  /Zp[n],如 cl /Zp4 表示對齊大小是4位元組; 2. 預處理命令   #pragma pack( [ show ] | [ push | pop ] [, ide

StructUnion的區別

struct union和 區別 Struct:結構體Union:聯合體 聯合體是幾個不同類型的變量共占一段內存(相互覆蓋),因為是內存共享,所以它不能同時存放多個成員的值,而只能存放其中的一個值,就是最後賦予它的值,例如:uni.a=3,uni.b=4.5,uni.c="A";賦值之後共享的同一

struct union

pri 執行 tput body size 如果 編譯 判斷 style 1. union的總大小等於它的最大字段的大小: union u1 { c

C之 struct union(十)

C語言 struct union 在 C 語言中我們經常會使用到 struct 和 union,那麽它們兩個各自有何特點呢?今天我們就一探究竟。 我們先來介紹下 struct 。它可以看做是變量的集合,那麽一個空的結構體占多大內存呢?這是一個有趣的問題,按照理論分析,

printimport

print:   使用逗號隔開,列印多個表示式 print("name", "Ben", 23) # name Ben 23   如上可見,引數之間是空格,如果要合併,又不想用字串格式化,可以這樣做 a = "name," b = "Ben," c = 23 print(a,

structunion區別

組成 最大 字節對齊 最大的 字節 原來 方式 有關 標準 主要區別有以下幾點: 1、在存儲多個成員信息時,編譯器會自動非是投入出題人每個成員分配存儲空間,struct可以存儲多個成員變量信息;而union每個成員會共用同一個存儲空間,且只能存儲最後一個成員的信息;

面試如何產品項目? -轉

situation 做事 例子 服務 公眾 幫助 是否 ati 需求  談一下你做的一個產品或者項目   這個問題其實不難回答,我之前經常會說,無論是你回答什麽樣的問題,其實都要從以下幾點去努力做出合適的回答   核心7點   任務發生的背景   面對的目標用戶   我們針

C語言筆記 第十課 structunion分析

第十課 struct和union分析 C語言中的struct可以看做變數的集合 struct的問題: 空結構體佔用多大記憶體? 10-1 空結構體的大小 C語言中的灰色地帶,觀點一是空結構體無意義不能存在於C語言裡面(VC10.0 /BCC),觀點二是空結構體為空集合,空集合為

C語言進階剖析 10 struct union

文章目錄 struct 的小祕密 例項分析: 空結構體的大小 結構體與柔性數 例項分析:柔性陣列使用分析 C語言中的 union union 的注意事項 程式

JNA的使用方法簡介(structunion

最近因為專案開發需要,用了到JNA的相關技術。下面就使用中的一些體會進行一下簡單的總結。 基本知識連結 遇到的主要問題 1.結構體內嵌結構體陣列的問題 按照網上的教程,對於巢狀的結構體,需要定義為 xxx.ByValue;但實際驗證過程中,定

結構體union大小的問題

請牢記以下3條原則:(在沒有#pragma pack巨集的情況下) 1:資料成員對齊規則:結構(struct)(或聯合(union))的資料成員,第一個資料成員放在offset為0的地方,以後每個資料成員儲存的起始位置要從該成員大小的整數倍開始(比如int在32位機為4

unionstruct型別的大小計算

對齊就是要滿足儲存變數的起始地址與對齊大小余數為0。 對於union,分兩步:先算union對齊大小,對齊的大小是取決於union成員中位元組對齊最大的那個;再算union實際分配的空間,而分配給union的實際大小不僅要滿足是對齊大小的整數倍,同時要滿足實際大小不能小於最

PHP 依賴註入控制反轉(二)

container nothing block 單元測試 int ner code blog 功能 今天有個朋友看到yii2中介紹的依賴註入一頭霧水,之前我寫過類似的文章發給他看了,可能還沒深入理解吧,這裏我再通俗點描述下依賴註入的原理吧,盡可能滴說通俗易懂一點吧:先還是扯

應用環境下的 TIME_WAIT CLOSE_WAIT

ech 防範 生效 場景 closed 防止 減少 進入 top 轉自:http://blog.csdn.net/shootyou/article/details/6622226 昨天解決了一個HttpClient調用錯誤導致的服務器異常,具體過程如下: http://

structclass內存大小的計算

有關 就是 大小 2個 ostream short out () 偏移 結構體內存大小的計算: 用例一: #include<stdio.h> union ss { int a; char b; }; struct MyStruct { int temp1

面向物件中的封裝、繼承多型

封裝 封裝說的是把資料封裝起來,對外暴露一個可以訪問的介面,不能讓外界直接訪問內部的資料。 從上面的描述可以抽取出兩種型別:介面和類。 從現在比較火的微服務的觀點上來看,一個類就是一個服務,一個物件就是一個服務的例項,通過這個服務暴露的介面來訪問這個服務。從這個意義上來講,面向

Redirect 客戶端重定向 Dispatch 伺服器端重定向

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!