【C语言】宏offsetof的模拟实现 (计算结构体中某变量相对于首地址的偏移)
首先我们应该特别留意 : offsetof 是一个宏,并非是一个函数 !
宏offsetof的介绍 :
参数:第一个是结构体类型名称,第二个是结构体成员名
返回类型:size_t无符号整形
引用的头文件:<stddef.h>
offsetof的使用举列 :
#include <stddef.h>
struct Stu // 注释为相对于起始位置的偏移量
{int a;//0~3char c;//4//5~7double d;//8~15
};
int main()
{printf("%d\n", sizeof(struct Stu));printf("%d\n", offsetof(struct Stu, a));printf("%d\n", offsetof(struct Stu, c));printf("%d\n", offsetof(struct Stu, d));return 0;
}
offsetof的模拟实现 :
#include <stddef.h>
//写一个宏,计算结构体中某变量相对于首地址的偏移,并给出说明
struct Stu
{int a;//0~3char c;//4//5~7double d;//8~15
};#define OFFSETOF(struct_type, mem_name) (int)&(((struct_type*)0)->mem_name)int main()
{printf("%d\n", OFFSETOF(struct Stu, a));printf("%d\n", OFFSETOF(struct Stu, c));printf("%d\n", OFFSETOF(struct Stu, d));return 0;
}
实现详解 :
我们假设结构体起始地址就是0,这样其成员的地址取出来再强制类型转换为int便可以表示结构体中某个成员相对于起始位置的偏移量,这是一种很巧妙的思考方式,即可实现宏 offsetof 的模拟实现;
【C语言】宏offsetof的模拟实现 (计算结构体中某变量相对于首地址的偏移)相关推荐
- C语言中利用宏,实现一个整数的奇数位和偶数位交换,以及计算结构体中某变量相对于首地址的偏移
C语言中的自定义宏 自定义宏,令其实现所需功能 1.写一个宏,可以将一个整数字的奇数位和偶数位交换. 2.写一个宏,计算结构体中某变量相对于首地址的偏移. 具体思路1: 首先取出当前数的奇数部分和偶数 ...
- C语言 泛型链表 如何计算(结构体中各元素)相对内存地址?(字节对齐,结构体对齐)offsetof()函数 ( (struct X*)0 ) -> Y)语法(匿名结构体)
示例: typedef struct _user {char name[20];char sex[20];int age;struct list_head mylist;//自定义结构体里保存双向循环 ...
- C++57个入门知识点_17 类的访问权限及C语言模拟类的封装(类的私有权限突破方法:编译期进行权限检查,运行期通过指针修改类的私有成员变量;利用函数指针对结构体中成员变量进行修改;CPU大小尾排列)
接上篇:C++57个入门知识点_16 类的标准写法(类名.成员变量.成员函数及对象命名规则:成员变量一般为私有,成员函数为公有并暴露给外部使用成员变量:防止类过大,声明写在.h,实现写在.cpp,调用 ...
- C语言的sizeof运算符计算结构体大小
C语言的sizeof运算符运算规则 sizeof运算符 **sizeof 是一个运算符,不是函数(方法).** 例子: 当想打印一个变量的存储区域大小时,可以直接写 int a = 5; printf ...
- C语言如何获取结构体中指定元素的大小?sizeof ( (X*)0 ) -> Y)(空指针操作)
获取结构体的大小,这好办,这样就可以了: #include <stdio.h>struct user {char name[20];char age[10]; };int main() { ...
- python中的记录指针_使用Python向C语言的链接库传递数组、结构体、指针类型的数据...
使用python向C语言的链接库传递数组.结构体.指针类型的数据 由于最近的项目频繁使用python调用同事的C语言代码,在调用过程中踩了很多坑,一点一点写出来供大家参考,我们仍然是使用ctypes来 ...
- libev中ev_loop结构体中宏定义的理解
libev源代码由于有各种宏定义,十分让人费解,作者这么写确实使得代码很简练,但也给读者的阅读带来了巨大的麻烦,下面将分析下ev_loop这个结构体的定义,加深对作者代码简化的理解,先上代码: str ...
- C语言 计算结构体大小
本文主要参考:结构体内存对齐(如何计算结构体的大小) 前言 数组是相同类型的元素的集合,只要会计算单个元素的大小,整个数组所占空间等于基础元素大小乘上元素的个数. 结构体中的成员可以是不同的数据类型, ...
- 通过宏函数计算结构体成员偏移量
编译器在为结构体成员分配内存时,由于存在内存对齐机制,各个成员所占空间可能不是连续的,因而不能简单的通过成员类型所占的字长来推断其它成员或结构体对象的地址. 获得结构体成员偏移量的方法可以参照 ...
最新文章
- Github标星3K+,超轻量级中文OCR,支持竖排文字识别、ncnn推理,总模型仅17M
- 解决linux服务器掉包问题
- html上传文件与后台处理,关于前端html图片和文件上传和后台接收方法
- react router路径的匹配原则
- powertoys中文版
- Oracle 11g服务器与客户端卸载、安装
- hadoop2.7 伪分布
- Zigbee网络架构+ZigBee的体系结构+理解zigbee节点的实现的案例+“51单片机” 和 “zigbee” 、 “cc2530芯片” 之间的关系+芯片cc2530
- cookie工作流程
- java解析tcp报文_JAVA语言TCP通信和JDBC示例(AIS信息解析)
- 拼接字符串时的引号嵌套
- MySQL 中随机抽样:order by rand limit 的替代方案
- HTML和XHTML解析(HTMLParser、BeautifulSoup)
- matlab设计滤波器
- 蓝牙音乐之AVRCP
- Groovy 教程系列(一)-- Groovy 入门
- oracle清空回收站指定表,oracle 删除表结构及清空回收站
- svchost.exe“病毒”
- CSS改变table内置tbody滚动条
- Comsumer的一些解释