- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
位操作:熟悉 | ^ 操作。应聘嵌入式C 开发的岗位会考这方面的知识。见实验5 。
结构体 共用体
如前面讲的,作为函数参数和返回值,结构体是值传递。结构体变量之间可以直接赋值,
结构体在初始化时才能整体赋值。
C99 里新的结构体初始化方法。初始化结构体的指定成员变量。见《C primer plus》P382
struct book{char a; int b; double c }; struct book surprise ={ .b=3 }; 即初始化指定的
成员变量b,其他成员变量的值赋值为0 。在内核驱动代码中会经常见到。
指向结构体的指针及使用
struct node { int data; struct node *next; } node1;
struct node *point=node1;
内存模型
高地址
next
dat
[ point ] node1
此时,point 指向node1。即*point 和node1 对应的是同一块内存。
(*point).dat 等价于node1.dat 对应的是同一块内存。
(*point).next 等价于node1.next 对应的是同一块内存。即黄色背景的内存。
point-next
为什么这段代码行得通:
int offset= ( ( (struct book*) 0 )-b); //获得成员变量b 在结构体的偏移量。
等价于:struct book *ptr=NULL; int offset= ( ptr-b) ; // (*ptr).b ;
编译器维护关于每个结构类型的信息,指示每个字段的字节偏移。它以这些偏移作为存
储器引用指令中的移位,从而产生对结构元素的引用的代码。结构体的各个字段的选取完全
是在编译时处理的。参考《深入理解》P166 页中的一个例子。
程序对内存的访问,都是先生成该内存的地址,再访问该内存。
结构体对齐,及填充
结构体的对齐与填充
C 语言标准未严格规定该如何对齐,不同系统的对齐策略略有不同。
参考《深入理解》P170 数据对齐。
linux 策略:linux/IA32 (Intel Architecture 32)下,基本类型按其占用字
节大小对齐。(即该类型变量的首地址能被sizeof (类型)整除,基本类型是指泛
整形和浮点类型)。
结构体按其最大成员变量的对齐规则对齐。若结构体按 n 个字节对齐,那
么结构体的大小也要能被n整除。
结构体内的成员按上图的方式对齐。
struct S{ int a; char b; }; 该结构体按其最大成员int 的对齐规则对齐。
结构体struct S 按4 个字节对齐,即它的首地址和大小必须都能被4 整除。
因为有对齐的要求就出现了内存填充(空着若干个字节,不使用)。
A
c j d 结构总大小 结构体对齐要求
0 4 8 12 16 4
B
c d j 结构总大小 结构体对齐要求
0 4 5 8 12 4
C
w c 结构总大小 结构体对齐要求
0 6 10 2
D
w c 结构总大小 结构体对齐要求
0 8 20 4
E
a p
文档评论(0)