1. 程式人生 > >結構體指定初始化和位初始化

結構體指定初始化和位初始化

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 ()

親測可用,有時候需要這樣用。