标准库里面提供的offsetof(t,m)宏,用来计算两个变量在内存中的地址偏移量

#include <stdio.h>
//原型:
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
/*
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) 对这个宏的讲解我们大致可以分为以下4步进行讲解:
1、( (TYPE *)0 ) 0地址强制 "转换" 为 TYPE结构类型的指针;
2、((TYPE *)0)->MEMBER 访问TYPE结构中的MEMBER数据成员;
3、&( ( (TYPE *)0 )->MEMBER)取出TYPE结构中的数据成员MEMBER的地址;
4、(size_t)(&(((TYPE*)0)->MEMBER))结果转换为size_t类型。
宏offsetof的巧妙之处在于将0地址强制转换为 TYPE结构类型的指针,
TYPE结构以内存空间首地址0作为起始地址,则成员地址自然为偏移地址。
可能有的读者会想是不是非要用0呢?当然不是,我们仅仅是为了计算的简便。
也可以使用是他的值,只是算出来的结果还要再减去该数值才是偏移地址。
*/
typedef struct stu1{
  int a;
  char b[1];
  int c;
}stu1;
void main()
{
  printf("offsetof(stu1,a):\t%d\n",offsetof(stu1,a));
  printf("offsetof(stu1,b):\t%d\n",offsetof(stu1,b));
  printf("offsetof(stu1,c):\t%d\n",offsetof(stu1,c));
  printf("sizeof(stu1) :\t%d\n",sizeof(stu1));
}

offsetof(stu1,a): 0

offsetof(stu1,b): 4
offsetof(stu1,c): 8
sizeof(stu1) : 12
Press any key to continue

offsetof宏---个人笔记的更多相关文章

  1. Linux 内核预备知识:浅析 offsetof 宏以及新手的所思所想

    最近一头扎进了 Linux 内核的学习中,对于我这样一个没什么 C 语言基础的新生代 Java 农民工来说实在太痛苦了.Linux 内核的学习,需要的基础知识太多太多了:C 语言.汇编语言.数据结构与 ...

  2. 结构体指offsetof宏详细解析

    1.#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE*)0)->MEMBER)     (include/linux/stddef.h) ...

  3. C++类和对象(一)&&实现offsetof宏&&this指针

    一.目录 1.对象的相关知识 2.类的定义 3.类的实例化 4.类对象模型 5.模拟实现offsetof宏 6.this指针 二.正文 1.对象的相关知识 C语言是面向过程的,关注的是过程,分析求解问 ...

  4. offsetof宏的实现

    1.c语言的结构体中,因为字节对齐的问题,导致成员地址并不能根据类型的大小进行计算.例如: struct test { char ch; int a; } printf("test的大小=% ...

  5. offsetof宏与container_of宏

    offsetof宏与container_of宏1.由结构体指针进而访问各元素的原理(1)通过结构体整体变量来访问其中各个元素,本质上是通过指针方式来访问的,形式上是通过.的方式来访问的(这个时候其实是 ...

  6. container_of 和 offsetof 宏详解

    在linux内核链表中,会遇到两个宏. 在include/linux/stddef.h中,有这样的定义 #define offsetof(TYPE, MEMBER) ((size_t) &(( ...

  7. Excel 使用VBA或宏----简单笔记

    一.一种纯粹的录制宏.(未使用此方法,如有兴趣可自学),就是Excel提供了“所见即所得”的方式生成宏.把自己想要的操作记录,录制成宏. 自学网等各种网站有教学视频或文章 二.常用VBA语法及函数笔记 ...

  8. linux中offsetof与container_of宏定义

    linux内核中offsetof与container_of的宏定义 #define offsetof(TYPE, MEMBER)    ((size_t) &((TYPE *)0)->M ...

  9. (转)offsetof与container_of宏[总结]

    1.前言 今天在看代码时,遇到offsetof和container_of两个宏,觉得很有意思,功能很强大.offsetof是用来判断结构体中成员的偏移位置,container_of宏用来根据成员的地址 ...

随机推荐

  1. PYTHON 转化函数

    ord(c)#字符转ASCII码值,10进制:自变量只能是一个字符 chr(a)#通过ASCII码值得到对应的字符 bin()函数:将整数(十 等进制)转化为二进制 bool():将指定参数转化为bo ...

  2. 自定义注解@MyBatisRepository

    新建一个注解用作dao扫描 /** * @author fuguangli * @description 标识MyBatis的DAO,方便{@link org.mybatis.spring.mappe ...

  3. K8s基本概念资料

    https://www.cnblogs.com/menkeyi/p/7134460.html

  4. Jupyter使用快捷键

    命令行模式(按 Esc 生效) F: 查找并且替换 Ctrl-Shift-F: 打开命令配置 Ctrl-Shift-P: 打开命令配置 Enter: 进入编辑模式 P: 打开命令配置 Shift-En ...

  5. 前端开发入门到进阶第三集【js进行url解析】

    https://www.cnblogs.com/yuanzhiguo/p/8241644.html

  6. FPGA经典:Verilog传奇与基于FPGA的数字图像处理原理及应用

    一 简述 最近恶补基础知识,借了<<Verilog传奇>>,<基于FPGA的嵌入式图像处理系统设计>和<<基千FPGA的数字图像处理原理及应用>& ...

  7. 分别在Update和FixedUpdate使用GetKeyDown

    测试目的 探究分别在Update和FixedUpdate使用GetKeyDown执行次数,会不同的 测试开始 在Update测试 我们先在Update测试,很正常是一帧重置一下状态,以防止点击一下执行 ...

  8. Python基础之PyQt5关闭界面

    想让执行完程序后自动关闭窗口,而不用点击右上角叉叉的方法是self.close(),具体应用还是以treewidget为例. 前面我们写了一个treewidget的界面,并且实现了界面代码分离,具体实 ...

  9. Python - 基础数据类型 tuple 元组

    元组简单介绍 元组是一个和列表和相似的数据类型,也是一个有序序列 两者拥有着基本相同的特性,但是也有很多不同的地方 声明元组 var = (1, 2, 3) var = ("1", ...

  10. Oracle 分页查询的一个实例

    1.分页模板 select * from ( select rownum as rn , a.* from( 某个表名) a) where rn between 0 and 6 2 某个表名 sele ...