C语言中的offsetof宏计算结构体中某变量相对于首地址的偏移

这边直接看代码吧(注释):

include<stdio.h>
#define OFFSETOF(type , n) (int)&(((type*)0)->n)//(type*)0 -- 0是整数的自然起点,这样就就可以以0坐起点来计算偏移量
//定义结构体												//
struct my_str
{
	int a;
	char b;
	float c;
};

int main() {
	printf("a:%d ", OFFSETOF(struct my_str, a));
	printf("b:%d ", OFFSETOF(struct my_str, b));
	printf("c:%d ", OFFSETOF(struct my_str, c));
	//替换后
	printf("c:%d ", (int)&(((struct my_str*)0)->a));
	return 0;
}

解析:

offsetof宏是一个预处理器指令,其功能是计算给定结构体类型中特定成员的偏移量(即字节距离)。

这里的(type*)0是一个技巧性的用法,它将0强制转换为指向type类型结构体的指针。由于0是一个常数,实际上并不会去访问任何实际的内存地址,而是利用这个“伪”指针来获取成员n的地址。接着通过取地址符&得到成员n的地址,最后转换成整型值表示偏移量。

上述代码中,我们定义了一个名为my_str的结构体,包含三个成员:整型变量a,字符变量b和浮点型变量c。通过OFFSETOF宏,我们可以分别获取这三个成员在其所在结构体内的偏移量。

就这么简单思路就是(type*)0 去找结构体得元素就可以计算出偏移量

最近更新

  1. TCP协议是安全的吗?

    2024-03-29 15:58:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-29 15:58:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-29 15:58:01       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-29 15:58:01       20 阅读

热门阅读

  1. 算法题1两数之和

    2024-03-29 15:58:01       17 阅读
  2. Windows运维_Windows下配置Apache-Haus(Apache2.4)

    2024-03-29 15:58:01       15 阅读
  3. 如何分配FPGA管脚

    2024-03-29 15:58:01       21 阅读
  4. vue3 绑定form弹窗的方式

    2024-03-29 15:58:01       15 阅读
  5. angular 组件传值交互

    2024-03-29 15:58:01       19 阅读
  6. Python进行DevOps实践

    2024-03-29 15:58:01       16 阅读
  7. Calendar日历类

    2024-03-29 15:58:01       18 阅读
  8. Python教程:一文掌握Python多线程(很详细)

    2024-03-29 15:58:01       16 阅读
  9. 离散数对问题

    2024-03-29 15:58:01       17 阅读
  10. CentOS 7 安装python 3.7 需要必要的依赖。

    2024-03-29 15:58:01       16 阅读