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 ()
亲测可用,有时候需要这样用。