根据结构体某个成员的地址求出结构体所有成员的值
来源:互联网 发布:阿里云服务器机房地址 编辑:程序博客网 时间:2024/05/19 22:07
思路:根据结构体部分成员的值,求出该结构体的首地址,从而求出所有成员的值。
下面是一个结构体的内存模型
低地址 ——> 高地址
|_________|______|______|_____________|
首地址 成员1 成员2 成员3 …… 末地址
根据内存模型,思考:如果可以求出某个成员的地址,再求出该成员离首地址的偏移量,然后用地址减去偏移量就可以求出首地址。
以成员2为例:
低地址 ——> 高地址
|_________|______|______|_____________|
首地址 成员1 成员2 成员3 …… 末地址
|_______n_______|
hp mp2
hp代表结构体首地址;n为成员2到首地址的偏移量,即灰色线段的长度;mp2为成员2的地址。故,hp = mp2 – n。
有了这些基础,再看看本文讨论的题目“根据结构体某个成员的地址求出结构体所有成员的值”,那么mp2的值相当于是已知的。
那么剩下的问题就是如何求n,也就是如何求出mp2到结构体首地址的偏移量。
首先,定义一个结构体:
typedef struct _tagTest
{
int x;
int y;
int z;
}Test,t;
假设我们知道&t.y。
那么,(size_t)&((Test*)0->y)的含义就是:将0强转成“Test*”类型的指针,求出y的地址。这个y的地址就是相对于地址0的绝对长度,也就相当于它在所在结构体中的偏移量。
示例代码:
#include <stdio.h>
#define offsetof(type, mumber) ((int)(&((type *)0)->mumber))
#define getheadpoint(address, type, field) \
((type *)((char *)(address)-(unsignedlong)(&((type *)0)->field)))
typedef struct _test_
{
int x;
int y;
int z;
}Test;
int main(void)
{
Test *p;
Test tmp;
tmp.x = 1;
tmp.y = 2;
tmp.z = 3;
printf("offset = %d\n",offsetof(Test,z));
p =getheadpoint(&tmp.z,Test,z);
printf("x = %d\ny = %d\nz = %d\n",p->x,p->y,p->z);
return 0;
}
- 根据结构体某个成员的地址求出结构体所有成员的值
- 通过结构体某个成员的地址计算结构体首地址
- 通过结构体某个成员的地址计算结构体首地址[转]
- 根据结构体成员变量的地址,得到结构体的地址
- 根据结构体某一成员的地址得到该结构体变量的首地址
- C语言根据结构体成员变量的地址,得到结构体的地址
- 怎样根据结构成员的地址找到结构体的地址(list_entry)
- 【C_C++】根据结构体中的成员地址求结构体的地址
- 如何求出结构体的成员变量的偏移量
- 根据成员变量的地址推算出结构体变量的地址
- 根据成员变量的地址推算出结构体变量的地址
- 根据成员变量的地址推算出结构体变量的地址
- 从结构体成员获取结构体地址的方法
- 结构体成员地址在结构体内的偏移
- list结构体根据某个成员进行排序
- 根据成员变量地址推算出结构体变量地址
- c语言结构体及成员的互换,并且打印结构体地址和成员地址
- 结构体的地址与数据成员的地址
- 蜗牛—C#程设之DataGridView数据库绑定控件
- Making User-Managed Backups-17.3、Making User-Managed Backups of Offline Tablespaces and Datafiles
- JSON 字符串 与 java 对象的转换
- 对苹果“五仁”编程语言Swift的简单分析
- setDescendantFocusability,在父View和子View间处理焦点关系
- 根据结构体某个成员的地址求出结构体所有成员的值
- 中断处理体系结构
- jquery $.get $.post的区别
- 利用图像中物体轮廓做简单的图像匹配
- 一个简单的自动化测试报告
- hadoop学习笔记之数据排序
- usaco 4.4.2 Pollutant Control
- 杭电 1421 搬寝室
- 适用于kali linux的远程桌面开启方法(从windows xp 远程登录到kali linux )