struct和union是c語言中兩種不同的資料結構,兩者都是常見的復合結構,其區別主要表現在兩方面:
1、聯合體中所有成員共用一塊位址空間,即聯合體只存放了乙個被選中的成員,而結構體中所有成員占用空間是累加的,其所有成員都存在,不同成員會存放在不同位址。
在計算乙個結構體變數的總長度時,其記憶體空間大小等於所有成員長度之和(需考慮位元組對齊);而在聯合體中,所有成員不能同時占用記憶體空間,它們不能同時存在,所以乙個聯合體型變數的長度等於其最長的成員的長度。
例如:
typedef uniondate;
struct datatoo;
date max;
則語句
printf(「%的」,sizeof(struct date)+sizeof(max));的執行結果是多少?
假設為32位機,int型別佔4個位元組,double型別佔8個位元組,char型別佔1個位元組,而date是乙個聯合型變數,聯合型變數公用空間,union裡面最大的變數型別是int[5],所以占用20個位元組,它的大小是20,而由於union中的double佔了8個位元組,因此union是8位元組對齊,所以記憶體占用空間為8的倍數。為了實現8位元組對齊,所佔空間為24個位元組。而data是乙個結構體變數,每個變數分開占用空間,依次為sizeof(int)+sizeof(date)+sizeof(double)=4+24+8=36,按照8位元組對齊,占用空間為40,所以結果為40+24=64。
2、對於聯合體的不同成員賦值,將會對它的其他成員重寫,原來成員的值就不存在了。而對結構體的不同成員賦值是互不影響的。
C語言與GLSL語言中struct的差別
c 語言與glsl 語言中struct 的差別 對於乙個如下 struct structcbchangeeveryframe test 在c語言中,此處test等價於struct cbchangeeveryframe 此處代表結構體型別的別名 而在glsl語言中,test 是結構體struct cb...
C 語言中 struct 的陷阱
假設我們要為某大學寫乙個工資管理程式。首先是表示員工的 employee 類 employee.cs 01 namespace skyiv.ben 02 06 public string name 07 public decimal salary 08 09 public employee stri...
C 語言中 struct 的陷阱
假設我們要為某大學寫乙個工資管理程式。首先是表示員工的 employee 類 employee.cs 01 namespace skyiv.ben 02 06 public string name 07 public decimal salary 08 09 public employee stri...