結構體成員的記憶體分布以及大端小端

2021-07-02 01:09:54 字數 1811 閱讀 5156

大端與小端:

小端:位元組的低位放在記憶體低位位址,高位放在記憶體高位位址。

判斷系統是大端還是小端?

若判斷處理器是big還是little模式,有兩種方法。

1、int i=1;   

char *p=(char *)&i;   

if(*p==1)     

printf("小端");  

else

printf("大端");

大小端儲存問題,如果小端方式(i佔至少兩個位元組的長度)則i所分配的記憶體最小位址那個位元組中就存著1,其他位元組是0.大端的話則1在i的最高位址位元組處存放,char是乙個位元組,所以強制將char型量p指向i則p指向的一定是i的最低位址,那麼就可以判斷p中的值是不是1來確定是不是小端

位元組對齊:

結構體的對齊參

1.union

#include

typedef union 

u11;//首先按照char c[10]分配10個位元組,然後按照char的1個位元組對齊,最終sizeof(u11)=10;

typedef union 

u22;//首先按照char c[10]分配10個位元組,然後按照char的4個位元組對齊,最終sizeof(u11)=12;

typedef union 

u33;//首先按照char c[10]分配10個位元組,然後按照char的8個位元組對齊,最終sizeof(u11)=16;

int main(void)

結果:

2.struct

#include

structa;//sizeof(short)=2,都是short,以2個位元組整數倍對齊,最後為6.

structb;//sizeof(long)=4,sizeof(short)=2,以4個位元組整數倍對齊,最後為8。

int main(void)

結果:

編譯器中提供了

#pragma pack(n)來設定變數以n

位元組對齊方式。n位元組對齊就是說變數存放的起始位址的

偏移量有兩種情況:第

一、如果n大於等於該變數所占用的位元組數,那麼偏移量必須滿足預設的對齊方式,第

二、如果n小於該變數的型別所占用的位元組數,那麼偏移量為n的倍數,不用滿足預設的對齊方式。結構的總大小也有個約束條件,分下面兩種情況:如果n大於所有

成員變數型別所占用的位元組數,那麼結構的總大小必須為占用空間最大的變數占用的空間數的倍數;否則必須為n的倍數。

下面舉例說明其用法。

#pragma pack(push) //儲存對齊狀態

#pragma pack(4)//設定為4

位元組對齊

struct test

;#pragma pack(pop)//恢復對齊狀態

以上 結構體的大小為16,下面分析其儲存情況,首先為m1分配空間,其

偏移量為0,滿足我們自己設定的對齊方式(4

位元組對齊),m1大小為1個位元組。接著開始為m4分配空間,這時其偏移量為1,需要補足3個位元組,這樣使偏移量滿足為n=4的倍數(因為sizeof(double)大於4),m4占用8個位元組。接著為m3分配空間,這時其偏移量為12,滿足為4的倍數,m3占用4個位元組。這時已經為所有

成員變數分配了空間,共分配了16個位元組,滿足為n的倍數。如果把上面的

#pragma pack(4)改為#pragma pack(8),那麼我們可以得到結構的大小為24。

結構體成員的記憶體分布與對齊

我們先看一道 ibm和微軟的筆試題 ibm筆試題 structa structb sizeof a 6,sizeof b 8,為什麼?注 sizeof short 2,sizeof long 4 微軟筆試題 struct example1 struct example2 int main int a...

結構體成員的記憶體對齊

include void printf arr quint8 data,int len,quint8 base num if 16 base num printf n struct frame big struct frame small struct frame union union int m...

記憶體的大端小端儲存

只需要判斷低位址存放的是高位資料 大端儲存 還是低位資料 小段儲存 資料0x0a0b0c0d,位址0x1000,大端儲存為 不同的cpu處理記憶體資料的方式不同,以及cpu和網路處理資料的方式也可能不同,所以要指明大端還是小端。尤其是在做跨平台專案的時候。網路位元組序,是和大端系統一致。也就是網路上...