當前位置:
首頁 > 知識 > C語言基礎——結構體

C語言基礎——結構體


在很多的筆試題裡面都有一些關於結構體的知識,主要是考察結構體的內存對齊,聯合體的大小和枚舉的值。今天小編就來帶大家分析一下這些問題。


結構體內存對齊


結構體在C/C++中都是經常用到的。在C++中,它與class的主要區別就是struct的成員默認是public的,而class是默認為private的,兩者的內存大小計算方式是一樣的。


首先我們來看看一個空的結構體



C語言基礎——結構體


空結構體


它的大小為1個位元組,那麼為什麼是1個位元組呢。因為在C/C++中每個對象都必須要有一個地址值,這個就是為了佔住內存用的,所以我們需要記住空結構體的大小是1個位元組。


接著我們就需要了解一下C/C++內置類型的大小



C語言基礎——結構體



內置類型大小表


由上表可知32位系統和64位系統除了指針位數不一樣,其他的基本數據類型都是相同的。所以下面小編就以32位的系統測試,64位系統是一樣的,如果涉及指針只需要改一下相關的大小就可以了。


求解結構體大小最終要的就是需要考慮內存對齊。在結構體中方便機器查找到數據成員,所以採用了內存對齊。


想要一起學習C++的可以加裙二四八八九四四三零,裙內有各種資料滿足大家,歡迎加裙

內存對齊就是按照結構聲明的順序,依次放入內存中。這裡涉及到了一個偏移量的問題。舉個例子



C語言基礎——結構體



這裡有一個結構體,根據內置類型大小表可知:char 1個位元組,bool 1個位元組,float 4個位元組,int 4個位元組,按照一般的加法來說這個結構體佔用10位元組,但是存在內存對齊他就會變成16個位元組。在內存中c對S的偏移量為0,第一個位元組就被c給佔了,接下來是i,由於i是4個位元組,當前的偏移量為1不是4的整數倍,所以偏移量就會移動到離當前偏移量最近的那個4的倍數,在這裡就是移動到第4個位元組,將i的4個位元組填充到內存,接下來b佔1個位元組,當前偏移量是8,是1的整數倍,所以直接把b的1個位元組填充進內存,接著是f佔4個位元組,當前偏移量是9不是4的整數倍,所以需要向後偏移到12,再把當前f的4個位元組填充到內存,現在的整個偏移量為16位元組,判斷其是不是結構體最大成員的整數倍,如果是那麼這個值就是結構體的大小,如果不是偏移量就往後移到最大成員的整倍數。這樣結構體S的大小就為16個位元組。


如果我們將結構體改成



C語言基礎——結構體



那麼此時的結構體大小就為24個位元組。


如果我們不想使用內存對齊,那麼我們就需要聲明一個宏#pragma pack(),設置當前的結構體的邊界對齊,可以將邊界對齊設置我們想要設置的值,在vs下默認為8,在Linux默認為4,而且vs可以設置為,在Linux裡面只能設置為。


如果我們使用#pragma pack(1),那麼上面的結構體的大小就會變成10個位元組。這個是因為系統會在你設置的值(這裡是1)與當前成員比較誰小就按照這個值來內存對齊,如果設置#pragma pack(2)那麼結構體的大小就會改為12個位元組,如果設置#pragma pack(4),那麼結構體的大小就為16個位元組。

綜上所述,設計結構體的時候盡量讓小的成員聲明在前這樣可以省下一定的空間。


聯合體


聯合體就是大家一起共用同一塊內存,聯合體的大小跟聯合體最大的那個成員大小是相同的,例如



C語言基礎——結構體



聯合體


這個聯合體的大小4個位元組。這個是比較簡單的,我們也只需要記住空的聯合體也是1個位元組就可以了。


枚舉類型


枚舉類型筆試中經常考這樣的模式



C語言基礎——結構體


枚舉類型


問你ABCD的值是多少。


這種題只要上機試過或者看過答案就能記住A 0,B 1,C 100,D 101,小編就在這給大家測試了。


還有一種情況



C語言基礎——結構體



這樣就會出現重複的項,即A 0,B 1,C 2,D 3,E 1,F 2,G 3,H 4。


還有就是枚舉類型的大小,記住:不管枚舉類型有沒有成員都是4個位元組。只要記住這句話就可以了。


結束語:

如果喜歡這篇頭條,一定要收藏喲^O^


點擊關注,了解更多關於編程的知識^O^


如果有不懂的地方,可以留言,相互探討,相互學習,共同進步^O^


想要一起學習C++的可以加裙二四八八九四四三零,裙內有各種資料滿足大家,歡迎加裙



C語言基礎——結構體


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 C加加 的精彩文章:

Linux下C語言的幾道經典面試題
C語言入門只需如此簡單

TAG:C加加 |

您可能感興趣

C語言編程入門基礎結構體和指針
數據結構與演算法分析——C語言描述
網路語言VS傳統文化 材料作文
R語言介紹與基礎
「體驗式」建築和現代極簡設計語言締造者
AWS自然語言處理服務新功能!從複雜文本中提取內容並客制化分類
怎樣攻克SCI論文撰寫語言關
文本分析:語言和文體
C 語言動態數組
論肢體語言的魅力
詳解 BP 神經網路基本原理及 C 語言實現
嬰兒學習語言的基礎能力,感知語言的聲音和結構
身體語言2 課程大綱
C語言編程新手基礎入門學習
服裝製圖符號及結構設計語言
語言構件和習慣思維
R語言聚類演算法在新媒體中的場景應用
「體」在工業設計中的視覺語言與綜合造型
適當的肢體動作語言
自然語言處理:語言模型與評價方法