struct和union的記憶體分配

2021-07-05 03:43:47 字數 728 閱讀 1441

struct

struct結構體在分配記憶體時需要遵循記憶體對齊規則:

1. 結構體的起始儲存位置必須是能夠被該結構體中最大的資料型別所整除;

2. 前面單元的大小必須是後面單元大小的整數倍(每個資料成員儲存的起始位址必須是自身大小的整數倍),如果不夠就補齊;

3. 整個結構體的大小(即sizeof的結果)必須是最大資料型別的整數倍;

struct t;

t t = ;

t* p = &t;//0x28fee0

char* p_c = &t.c;//0x28fee0

int* p_i = &t.i;//0x28fee4

long

long* p_l = &t.l;//0x28fee8

char* p_ch = &t.ch;//0x28fef0

printf("sizeof t:%d\n",sizeof(t));//24

union

union關鍵字的用法與struct類似,但其空間大小僅為最大長度的資料成員,即union中的所有成員變數共享相同的記憶體區域

通常linux中採用小端模式,即高位元組儲存在高位址中

unions;

}u;u.i = 0x12345678

;printf("%x %x\n",u.p

.l,u.p

.h);//5678 1234

Union和struct的記憶體分配區別

今天看到有一段程式裡在struct裡面用了個union,然後就突然想到了struct和union的區別,找了些資料後發現,struct和union在記憶體分配的時候有區別,union裡的資料是公用一塊記憶體 所以給其分配的記憶體總是union裡面所定義的最大型別長度的整數倍。而struct裡的資料跟...

struct和union的大小

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

struct和union在記憶體中占用空間大小的計算

資料型別 32位系統 64位系統 bool 1位元組1位元組 char 1位元組1位元組 short 2位元組2位元組 int4位元組 4位元組long 4位元組8位元組 long long 8位元組8位元組 float 4位元組4位元組 double 8位元組8位元組 long double 12...