㈠ c語言 struct與uniont實際佔用的內存大小怎麼計算
咋windows下double佔8個位元組,如果考慮對齊那就是ctm和open共用八個位元組,high和low共用八個位元組,close自己用八個位元組,vol自己用八個位元組,所以是32
linux下是double4個位元組吧。
㈡ C語言的結構體和共同體的區別是什麼
結構體(structure)是一種構造類型,它是由若干「成員」組成的。每一個成員可以是一個基本數據類型或者又是一個構造類型,而且每個成員的數據類型可以相同也可以不相同。共同體(union)將幾種不同的變數儲存在同一內存單元中,也就是使用覆蓋技術,幾個變數互相覆蓋,這種幾個不同的變數共同佔用一段內存的結構,可見二者最大的區別就是所佔用的內存,結構體(structure)所佔用的內存是分量內存之和,共同體(union)所佔用的內存是等於最大的分量的內存。
具體來說,結構體(structure)與共同體(union)主要有以下區別:
1.結構體(structure)與共同體(union)都是由多個不同的數據類型成員組成,
但在任何同一時刻,
共同體(union)中只存放了一個被選中的成員,
而結構體(structure)的所有成員都存在。在結構體(structure)中,各成員都佔有自己的內存空間,它們是同時存在的。一個結構體(structure)變數的總長度等於所有成員長度之和。在共同體(union)中,所有成員不能同時佔用它的內存空間,它們不能同時存在。共同體(union)變數的長度等於最長的成員的長度。
2.
對於共同體(union)的不同成員賦值,
將會對其它成員重寫,
原來成員的值就不存在了,
而對於結構體(structure)的不同成員賦值是互不影響的。
㈢ C語言union的用法
1、我們利用C語言定義一個簡單的Union共用體結構。
㈣ C語言union 和struct,什麼時候用union比struct更好,解釋就可以了
對於一個union類型的變數,所有成員變數共享一塊內存,該內存的大小有這些成員變數中長度最大的一個來決定 union分配的內存是連續的。
那為什麼要發明union呢?這是由於union的特性決定的,因為struct中成員變數雖然內存都是獨立的,但是struct不能保證分配的內存是連續的。
舉個例子:CPU的ax寄存器分為ah和al兩部分,我們現在要給其賦值,就可以採用union:
union _ax_register {
int i; // 4Bytes, union將按此分配一個4位元組的連續內存
unsigned short ah; // 2 Bytes
unsigned short al; // 2 Bytes
} ax_register;
現在,給ax_register.i賦值,其高16bit就會賦給ah,低16bit就會賦給al,是不是很方便呢?
再舉個例子,IP地址,我們使用union,就可以直接給他賦一個int值,就能給IP的四個段同時賦值,如果用struct,就麻煩多嘍,如下:
union _ip_address {
int i; // spaceholder
unsigned char ip_first_num;
unsigned char ip_second_num;
unsigned char ip_third_num;
unsigned char ip_fourth_num;
} ip_address;
這樣,給ip_address.i 賦值,就自動將其8bit 8bit的賦給了四個IP欄位。是不是很方便?更方便的是,現在要比較兩個IP地址的大小,只要比較這個int值就OK了
㈤ C語言中struct結構體和union共用體在物理內存上有何異同
struct
會為每一個屬性分配一塊合理的內存(之所以說合理是因為存在內存對齊),而union會分配一塊最大的成員佔有的內存,比如含有double和char
他就會給一塊double大小的內存,當寫入一個變數時原來的變數的值將會被沖刷掉,也就是實現了內存共用。
㈥ c語言 union 中包含 struct
兩個類型不一樣
strut 的成員 彼此獨立的內存空間
union的成員則是共享 內存空間