完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
结构体的变量的指针和结构体内部成员的指针的关系
其实他们两者在内存地址上是有一定的数值关系的。其实结构体变量的地址和结构体变量中的成员是通过一定的偏移量来获取的。也就是说得到结构体变量的地址后通过增加一定的偏移值就可以得到结构体变量的成员地址(可能成员是一个普通变量,也可能是一个结构体。但是都满足结构体内部的指针偏移的)。 在读的一本书中 有这么一个方式来获取一个链表结构体成员所在的结构体变量的首地址(也就是说在这个结构体中存在着一个链表结构体变量没那么就可以通过这个链表结构体变量去得知结构体变量的地址)。 假设 typedef struct alist //这个是一个链表结构体,操作系统中是用于将他所在的结构体变量穿成一个链表。 { struct alist *prev,*next; }alist; typedef struct system { u32_t sys_count; alist sys_list; }sys; system这个结构体中存放了一个alist sys_list; ,所以通过这个结构体变量就可以将system结构体变量串接成一个链表,正是由于这个alist的存在。 那么我们如何来使用这种倒查的方式呢? 其实我们通过这个链表结构体将这个system结构体变量串接之后,通过链表结构体变量的地址值减去链表结构体在system结构体中偏移值就可以反映出system结构体变量的首地址了。 具体例子: 首先我们链表会有一个头指针 head 假设head.next指向第一个链表结构体变量,那么这个时候head.next中的地址值就是链表结构体变量的真实地址。 好! 这个时候再通过 (& ((sys *)0)->sys_list)这个式子就是能够得出这个链表结构体变量在system结构体中的偏移值。为什么是偏移值呢? 其实由于((sys *)0)这个的存在,它是以地址0的方式去调用结构体中的成员。再通过这个&取地址操作符来获取成员地址,其实这个就是他在system结构体中偏移值(因为偏移值就是结构体成员的地址值-结构体变量的地址值)。 好!已经得到偏移值了。那么很快就能通过结构体的成员地址获取结构体变量的地址了。 head.next中的地址值就是链表结构体变量的真实地址,也就是system结构体成员(sys_list)的地址。 所以通过这个 head.next -(& ((sys *)0)->sys_list) 。(注:因为偏移值就是结构体成员的地址值-结构体变量的地址值,也就是 结构体变量的地址值 = 结构体成员的地址值 - 体内偏移值)。 然而由于操作系统需要的数据格式 所以不能简单的这么写,于是 sys *sys_p; //结构体变量的指针 sys_p = (sys *)((char *)head.next - (u32_t)(& ((sys *)0)->sys_list)) ok 这样就可以间接得到结构体变量的地址了。在嵌入式系统中很常用的链表功能。 |
|
|
|
只有小组成员才能发言,加入小组>>
「含关键代码」基于AM3352/AM3354/AM3359的Linux开发案例分享
4894 浏览 0 评论
87411 浏览 0 评论
【高手问答】如何做到精通linux技术?资深工程师带你突破难点
4725 浏览 2 评论
3620 浏览 2 评论
解读Linux :先从创建一个文件夹用来存放jdk压缩文件开始
2483 浏览 0 评论
1999浏览 3评论
1286浏览 1评论
求解:aarch64交叉编译工具已经安装成功,环境变量已经配置,怎么将系统架构切换为ARM的架构
1344浏览 0评论
电脑和虚拟机可以互ping,电脑和开发板也可以互ping,但是虚拟机和开发板ping不通是什么原因
1236浏览 0评论
1174浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 06:21 , Processed in 1.212171 second(s), Total 69, Slave 52 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号