1.結構體指定初始化
在閱讀linux2.6內核的時候,遇到這樣一段代碼:
static struct platform_device da850_evm_tl_leds_device = {
.name = "leds-gpio",
.id = 1,
.dev = {
.platform_data = &da850_evm_tl_leds_padata
}
};
可以看到是左邊 = 右邊的格式,左邊表示platform_device機構體的內的成員變量,右邊表示的具體的賦值函數,指定的賦值某個結構體成員。
如定義結構體
struct A{
int a;
int b;
int c;
}B;
賦值可以指定賦值,如A m={
.b = 3
}
2.結構體位賦值-位段結構體
有的協議並不都是按照字節來賦值的,有的是按照位來賦值,一個字節可以包含很多個字段,表示多個意思,針對與這種情況,可以用位段來處理這樣的協議。
如:
struct A{
int a:4;
int b : 3;
int c :1;
}B;
比如一個 unsigned char型數據m = 0xff,而結構體B也爲一個字節,那麼兩個就可以賦值,結構體成員變量a,b,c按位截取m。
位域的對齊
如果結構體中含有位域(bit-field),那麼VC中準則是:
1) 如果相鄰位域字段的類型相同,且其位寬之和小於類型的sizeof大小,則後面的字段將緊鄰前一個字段存儲,直到不能容納爲止;
2) 如果相鄰位域字段的類型相同,但其位寬之和大於類型的sizeof大小,則後面的字段將從新的存儲單元開始,其偏移量爲其類型大小的整數倍;
3) 如果相鄰的位域字段的類型不同,則各編譯器的具體實現有差異,VC6採取不壓縮方式(不同位域字段存放在不同的位域類型字節中),Dev-C++和GCC都採取壓縮方式;
系統會先爲結構體成員按照對齊方式分配空間和填塞(padding),然後對變量進行位域操作。
可以使用字節對齊,
如:
#pragma pack (1)
struct A{
int a:4;
int b : 3;
int c :1;
}B;
#pragma pack ()
親測可用,有時候需要這樣用。