1.結構體變數中的元素如何訪問?
(1)陣列中元素的訪問方式:表面上有2種方式(陣列下標方式和指標方式);實質上都是指標方式訪問。
(2)結構體變數中的元素訪問方式:只有一種,用.或者->的方式來訪問。(.和->訪問結構體元素其實質是一樣的,只是c語言規定用結構體變數來訪問元素用. 用結構體變數的指標來訪問元素用->。實際上在高階語言中已經不區分了,都用.)
(3)結構體的訪問方式有點類似於陣列下標的方式
2.利用指標訪問結構體元素
結構體元素位址=結構體首位址+元素偏移量
structmystruct
s1;的位址
int* p=(int*)((int)&s1+4
);*p=5;//
s1.b=5;
3.結構體對齊
一般情況下,為了配合硬體,如果對齊排布和訪問會提高效率,否則會大大降低效率。
(0)、一般編輯器預設4位元組對齊。
(1)、結構體對齊要考慮:結構體整體本身必須安置在4位元組對齊處,結構體對齊後的大小必須4的倍數(編譯器設定為4位元組對齊時,如果編譯器設定為8位元組對齊,則這裡的4是8)
(2)、結構體中每個元素本身都必須對其存放,而每個元素本身都有自己的對齊規則。
(3)、編譯器考慮結構體存放時,以滿足以上2點要求的最少記憶體需要的排布來算。
structmystruct1
; struct
mystruct11
;typedef
struct
mystruct111
my111;
typedef
struct
mystruct2
mys2;
struct
mystruct21
;typedef
struct
mystruct5
mys5;
struct
stu;
4.結構體對齊指令
以#prgama pack(n)開頭,以#pragma pack()結尾,定義乙個區間,這個區間內的對齊引數就是n。
#pragma pack(2)structs ;
#pragma pack()
取消對齊訪問
__attribute__((packed));
設定結構體整體對齊訪問(不包含元素)
__attribute__((aligned(n)));
structmystruct11
__attribute__((packed));
typedef
struct
mystruct111
__attribute__((aligned(1024))) my111;
5.offsetof巨集與container_of巨集
offsetof 在0位址處虛擬出乙個結構體,通過元素的位址則為偏移量
container_of 通過元素位址減去偏移量得到結構體位址
typeof()傳入變數,返回相應的資料型別。
#includestructmystruct;//
type是結構體型別,member是結構體中乙個元素的元素名
//這個巨集返回的是member元素相對於整個結構體變數的首位址的偏移量,型別是int
#define offsetof(type, member) ((int) &(((type *)0)->member))//
type *為傳入值
//ptr是指向結構體元素member的指標,type是結構體型別,member是結構體中乙個元素的元素名
//這個巨集返回的就是指向整個結構體變數的指標,型別是(type *)
//typeof() 是通過變數名 返回資料型別的
#define container_of(ptr, type, member) () //
元素位址-偏移量=結構體首位址
//通過元素位址減去偏移量得到結構體位址
intmain()
c語言 結構體對齊
1 編譯器是按照什麼樣的原則進行對齊的?a.資料型別自身的對齊值 對於char型資料,其自身對齊值為1,對於short型為2,對於int,float,double型別,其自身對齊值為4,單位位元組。b.結構體或者類的自身對齊值 其成員中自身對齊值最大的那個值。c.指定對齊值 pragma pack ...
C語言結構體對齊
解析c語言結構體對齊 記憶體對齊問題 c語言結構體對齊也是老生常談的話題了。基本上是面試題的必考題。內容雖然很基礎,但一不小心就會弄錯。寫出乙個struct,然後sizeof,你會不會經常對結果感到奇怪?sizeof的結果往往都比你宣告的變數總長度要大,這是怎麼回事呢?開始學的時候,也被此類問題困擾...
c語言結構體對齊
c語言結構體對齊也是老生常談的話題了。基本上是面試題的必考題。結構體到底怎樣對齊?下面總結了對齊原則,在沒有 pragma pack巨集的情況下 原則1 普通資料成員對齊規則 第乙個資料成員放在offset為0的地方,以後每個資料成員儲存的起始位置要從該成員大小的整數倍開始 比如int在32位機為 ...