最近在CU论坛上有很多人在问这样一个问题:给出一个结构体成员的地址计算该结构体的起始地址。其实这个题我之前也没有接触过,据说内核代码中有这样用的,但还没有看到。不过觉得这个题的解决方法还是有一定技巧的,就总结一下。下面是实现的代码。

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #define STRUCT_OFFSET(stru_name, element) (unsigned long)&((struct stru_name*)0)->element
 4 struct stru_addr
 5 {
 6     int a;
 7     char b;
 8     int d;
 9     char c;
10
11 };
12
13 int main()
14 {
15     struct stru_addr s;
16     unsigned long offset = 0;
17     printf("start addr of s = %x\n", &s.a);
18
19     offset = STRUCT_OFFSET(stru_addr, c);
20
21     printf("c_addr = %x, offset = %u\n", &s.c, offset);
22     printf("start addr of s caculated from c addr: %x\n", (char *)&s.c - offset);
23     system("pause");
24     return 0;
25 }

其实整个程序中最关键的部分就是如何求出结构体中某个成员相对于结构体首地址的偏移量。这里的解决方法是:假设存在一个虚拟地址0,将该地址强制转换成为该结构体指针类型(struct stru_name*)0。那么地址0开始到sizeof(struct)-1长度的内存区域就可以视为一个结构体的内存。这样结构体中任何一个元素都可以通过对该结构体指针解引用得到。由于该结构体的起始地址为0, 因此任何一个成员的地址应该等于其相对于结构体起始地址的偏移,这也就是计算偏移量的方法:(unsigned long)&((struct stru_name*)0)->element。

上面程序执行的结果如下:

1 [root@localhost tmp]# ./a.out
2 start addr of s = bf81b820
3 c_addr = bf81b82c, offset = 12
4 start addr of s caculated from c addr: bf81b820

上述的结果中还同时考虑了结构体内的对齐问题。

原文地址:http://blog.chinaunix.net/uid-10167808-id-25940.html

转载于:https://www.cnblogs.com/challenge1230/p/4383012.html

通过结构体某个成员的地址计算结构体首地址 (转)相关推荐

  1. 通过结构体某个成员的地址计算结构体首地址

    给出一个结构体成员的地址计算该结构体的起始地址,据说内核代码中有这样用的,但还没有看到.不过觉得这个题的解决方法还是有一定技巧的,就总结一下.下面是实现的代码. /* Author: Godbach ...

  2. C++ 结构体、成员函数、结构体指针的使用

    #include <iostream> using namespace std;struct st_girl {string name;int age;void setvalue(stri ...

  3. “结构体变量”与“结构体变量成员”的地址

    "&student1.num"和"&student1"的区别 #include<stdio.h>struct AGE {int ye ...

  4. c语言定义学生结构体类型,C语言中结构体的三种定义方式

    c语言中结构体的定义: struct 结构体名{ 成员列表: ..... }结构体变量: 7.1.1 结构体类型变量的定义 结构体类型变量的定义与其它类型的变量的定义是一样的,但由于结构体类型需要针对 ...

  5. 如何用c语言结构体建立data,C语言结构体使用

    结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类. 个人认为是C语言实现面向对象编程非常重要的数据类型之一 结构体的使用分为定义.引用. ...

  6. 宏定义来实现一个结构体成员相对于该结构体首地址的偏移量

    #define my_offerset(type , exp) ((int)&(((type*)0)->exp))//因为是求结构体的成员内存偏移.结构体会定义一种新的数据类型 所以ty ...

  7. c语言常量结构体的成员,c语言之结构体

    c语言之结构体 1.结构体基础知识 C语言提供了两种类型的聚合数据类型(能够同时存储超过一个的单独数据),数组和结构.数则是相同类型的元素的集合,而结构也是一些值的集合,这些值称为它的成员,单一个结构 ...

  8. c语言 typeof 结构体,Go语言通过反射获取结构体的成员类型

    任意值通过 reflect.TypeOf() 获得反射对象信息后,如果它的类型是结构体,可以通过反射值对象(reflect.Type)的 NumField() 和 Field() 方法获得结构体成员的 ...

  9. 结构体全局变量成员赋值

    struct s {int a; };s g;g.a = 1; // 编译错误void f() {g.a = 1; // 编译正确 } 为什么全局结构体变量成员只能在函数内调用? 因为g.a=1是赋值 ...

最新文章

  1. c++ 字符类型总结区别wchar_t,char,WCHAR(转)
  2. js怎么取到遍历中的特定值_LeetCode 1028 hard 从先序遍历还原二叉树 Python解题记录...
  3. [PHP] 安装PHP报错“Primary script unknown”的解决方法
  4. java创建树结构_Java学习之XML-017
  5. getresource 路径转义_java中的相对路径和绝对路径
  6. 在shell中全局变量与局部变量的区别及其举例
  7. css文本过长如何设置省略号
  8. 【Java与智能设备】4_1 Activity的创建和跳转
  9. 服务器硬盘和台式机有什么区别,服务器和电脑主机有什么区别?
  10. Zabbix proxy
  11. 【四足机器人那些事】足端轨迹规划(一)
  12. 微型计算机百度云,STONE_百度云资源_盘多多如风搜_盘搜搜_哎哟喂啊
  13. 郑大计算机研究生学硕好还是专硕好,2021郑州大学考研:学硕专硕的区别
  14. 我是如何从功能测试成功转型自动化测试人员的?
  15. Mysql上线长时间以后重新发起请求报错
  16. 大数据和传统数据的区别
  17. SEO网站优化真的比其他网络推广方式好吗,优势在哪里?
  18. 常用docker镜像
  19. 电源已接通,未充电——解决方案
  20. 关于软件测试的一些基本知识

热门文章

  1. List list=new ArrayList()怎么回事
  2. Davinci DM6446开发攻略-UBOOT-2009.03移植2 nand flash的烧写
  3. pat天梯赛L1-050. 倒数第N个字符串
  4. Ubuntu断电重启后黑屏左上角光标闪烁,分辨率低解决办法
  5. 基于 ELK Stack 和 Spark Streaming 的日志处理平台设计与实现
  6. 时间序列分类算法简介及其在能耗数据分类上的应用
  7. 一种 Android 应用内全局获取 Context 实例的装置
  8. Android开发工具之Android Studio---如何打JAR包
  9. 导出oracle sequences,CSS_oracle导出序列方法分析,方法一:SELECT ' CREATE SEQUEN - phpStudy...
  10. python替换excel指定字符串_【python】替换指定内容,excel数据预处理