博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
结构体指定初始化和位初始化
阅读量:6942 次
发布时间:2019-06-27

本文共 1000 字,大约阅读时间需要 3 分钟。

hot3.png

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

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

 

转载于:https://my.oschina.net/u/2252538/blog/1922104

你可能感兴趣的文章
网络传输中的三张表,MAC地址表、ARP缓存表以及路由表
查看>>
Windows+Apache2.4.10+PHP7.0+MySQL5.6.21安装
查看>>
AT NEW F、AT END OF F注意事项
查看>>
FOR ALL ENTRIES IN 与 INNER JOIN 写在一个SQL上影响效率
查看>>
2010年04月01日
查看>>
IDEA下maven工程的classpath
查看>>
sql的where条件转换成mongdb筛选条件
查看>>
支持新版chrome,用webstorm编译形成css和sourcemap,调试sass和less源文件(转)
查看>>
【转载】aspx,ascx和ashx使用小结
查看>>
蓝牙智能灯带(天猫精灵生态)方案
查看>>
Java缓存类的实际应用场景
查看>>
JQuery:怎么动态切换一个元素的显示、隐藏呢?原来隐藏就显示,原来显示就隐藏...
查看>>
SQL Server之存储过程基础知识
查看>>
Oracle 11g完全卸载(Windows)(转)
查看>>
(图 BFS)走迷宫
查看>>
转:Linux tcpdump命令详解
查看>>
计算机网络笔记整理
查看>>
cocos2d-js脚本编译为字节码,在windows上发布
查看>>
(三)java虚拟机内存管理和线程独占区和线程共享区
查看>>
矩阵旋转模板
查看>>