C C 乙個結構體變數占多大記憶體空間的問題

2021-08-29 20:19:19 字數 1717 閱讀 8128

直接來看相同資料結構體的幾種書寫的格式吧。

格式一:

1.structtagphone    

2.  phone1;  

格式二:  

1.structtagphone    

2.  phone2;   

格式三:  

1.structtagphone3    

2.  phone3;   

格式四:

1.structtagphone3    

2.  phone4;   

例題:請問下面定義的結構體變數aa在計算機記憶體中占用多少位元組?

#include

main()

struct  student

aa;printf("%d\n",sizeof(aa));  //螢幕上將顯示多少?

錯誤解答:我們都知道,char型別占用1個位元組,float型占用4個位元組,short int型別占用2個位元組,int型在vc6.0中占用4個位元組(tc2.0中占用2個位元組),long占用8個位元組,double占用8個位元組。因此,我們可能會犯乙個錯誤就是直接4+2+1=7,結構體aa占用7個位元組。這是錯的。

錯誤分析:計算結構體大小時需要考慮其記憶體布局,編譯系統為了提高計算機訪問資料的效率,在安排結構體每個成員的時候採用了記憶體對齊的方法,具體是:結構體在記憶體中的存放按單元進行存放,每個單元的大小取決於結構體中最大基本型別的大小

對格式一:

​​​​因為所有成員中b成員型別最大(int型占用4個位元組),故結構體phone1在記憶體分布時以4位元組為乙個單元來儲存每個成員。又因為a占用乙個位元組後,只剩下3位元組了,放不下後面緊挨的成員b了,所以必須開闢乙個新的單元來存放b,b剛好佔滿乙個單元,接下來的成員c又必須再開闢乙個新的單元來存放。這樣,phone1占用的位元組數就是:3*4=12;

同理對於格式二,

a後面還有三個位元組,足夠存放c,所以c就放在了a的後面,然後只剩下乙個位元組了,不夠存放後面的b,於是又開闢乙個新單元存放b。這樣,phone2占用的記憶體位元組就為2*4=8。

對於格式三: 

​上面結構體中,最大資料型別是char,佔乙個位元組,因此它的乙個儲存單元就是1個位元組。sizeof(phone3) =1 + 2 + 4 = 7, 其大小正好是結構體中各成員所佔記憶體空間之和,這種情況也是最節省儲存空間的。

對於格式四:

​phone4中最大的資料型別是double,佔8個位元組,因此它的乙個儲存單元就是8個位元組。由上圖可知sizeof(phone4)=4*8=32。

綜上所述,格式一和格式四是非常浪費儲存空間的,應該盡力避免;格式三對儲存空間的利用率是最高的;格式二儲存空間的利用率居中。作為乙個優秀的程式設計師,應該深入掌握這些寫法的差異性,以便視情況選用不同的寫法。

C C 語言結構體中定義另乙個結構體指標的經驗

本文進行討論的是,在linux中,c c 語言的結構體的使用情況。一般情況下,結構體的使用還是相對比較簡單的,它攜帶的一類物體的某一些屬性,比如struct person 這個結構一攜帶的就是乙個人的兩個基本資訊,年齡 age 和身高 height 同樣你也可以繼續新增人的相關資訊進去,比如學號,班...

C C 語言結構體中定義另乙個結構體指標的經驗

本文進行討論的是,在linux中,c c 語言的結構體的使用情況。一般情況下,結構體的使用還是相對比較簡單的,它攜帶的一類物體的某一些屬性,比如struct person 這個結構一攜帶的就是乙個人的兩個基本資訊,年齡 age 和身高 height 同樣你也可以繼續新增人的相關資訊進去,比如學號,班...

C C 語言結構體中定義另乙個結構體指標的經驗

本文進行討論的是,在linux中,c c 語言的結構體的使用情況。一般情況下,結構體的使用還是相對比較簡單的,它攜帶的一類物體的某一些屬性,比如 cpp view plain copy struct person 這個結構一攜帶的就是乙個人的兩個基本資訊,年齡 age 和身高 height 同樣你也...