offsetof的实现

简介: offsetof的实现

offsetof的作用是返回结构体成员相对于结构体起始位置的偏移量,第一个参数需要传入结构体类型,第二个参数需要传入结构体成员名


首先我们可以先看一下offsetof的官方声明:

offsetof (type,member)


从声明中可以看出它并没有类型检查,也就是说它可以接受任何形式的参数,而且因为它的第一个参数接收的是数据类型,即它是一个宏, 而宏的规则是替换那么我们应该如何对它进行模拟呢?结果如下代码。

#define OFFSETOF(type, name) &(((type*)0)->name)

image.gif

在这段代码中“&(((type*)0)->name)”type和name都是用户传入参数。


首先我们先写一个整数0(你也可以写1,2,3,等任何一个),然后再对其进行强制类型转换(将它转换成用户传入的类型type)将数字0强制类型转换成一个地址这个地址的数据类型为type,那么代码就变成了这样

#define OFFSETOF(type, name) (type*)0

那么我们现在也就相当于得到了结构体类型起始位置的地址,那么只要我们再用其成员类型的地址减去其实地址也就得到了偏移量。(因为起始位置的地址为0所以我就没减)代码如下

#define OFFSETOF(type, name) &(((type*)0)->name)


目录
相关文章
|
编译器 C语言
你应该知道的C语言干货(5)(memset,memcpy,memmove,memcmp)
我们知道包含string.h头文件后,就可以使用memset,memcpy,memmove,memcmp这些库函数,接下来让我们了解他们。
105 0
|
9月前
|
存储 安全
内存函数(memcpy、memmove、memset、memcmp)你真的懂了吗?
内存函数(memcpy、memmove、memset、memcmp)你真的懂了吗?
294 0
内存函数(memcpy、memmove、memset、memcmp)你真的懂了吗?
|
存储 安全
浅谈C库函数——memcpy、memmove、memcmp、memset函数
浅谈C库函数——memcpy、memmove、memcmp、memset函数
261 0
memcmp和strncmp函数
一.memcmp函数  原型:extern int memcmp(void *buf1, void *buf2, unsigned int count);          用法:#include     功能:比较内存区域buf1和buf2的前count个字节。
1199 0
|
存储 安全 编译器
【C语言】memcpy,memmove,memcmp,memset函数详解
【C语言】memcpy,memmove,memcmp,memset函数详解
【C语言】memcpy,memmove,memcmp,memset函数详解
|
6月前
【C初阶】内存函数:memcpy+memmove+memset+memcmp
【C初阶】内存函数:memcpy+memmove+memset+memcmp
内存函数 memcpy,memmove ,memcmp
memcpy表示内存函数,用法跟strcpy差不多, 都是作为拷贝函数存在 strcpy只能用于字符串函数,而memcpy函数可以使用任意类型 在使用任意类型时,肯定用到的参数是void void* memcpy(const void *dest,const void *src, size_t sum); 这里的sum作为字节数传递
210 0
内存函数 memcpy,memmove ,memcmp

热门文章

最新文章