结构体指定初始化和位初始化

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

亲测可用,有时候需要这样用。

猜你喜欢

转载自my.oschina.net/u/2252538/blog/1922104