C 库 - offsetof() 宏



C 库的 offsetof(type, member-designator) 宏生成一个类型为 size_t 的常量整数,表示结构体成员从结构体开头处的偏移量(以字节为单位)。成员由 member-designator 指定,结构体名称由 type 指定。

此宏通常用于像链表这样的数据结构中。

语法

以下是 C 库中 offsetof() 宏的语法:

offsetof(type, member-designator)

参数

此函数仅接受两个参数:

  • type − 这是 member-designator 为有效成员指定符的类类型。

  • member-designator − 这是类类型的成员指定符。

返回值

此宏返回类型为 size_t 的值,该值是成员在 type 中的偏移量。

示例 1

以下 C 库程序说明了 offsetof() 宏的使用。

#include <stddef.h>
#include <stdio.h>
   
struct address {
   char name[50];
   char street[50];
   int phone;
};
   
int main () {
   printf("name offset = %d byte in address structure.\n",
   offsetof(struct address, name));

   printf("street offset = %d byte in address structure.\n",
   offsetof(struct address, street));

   printf("phone offset = %d byte in address structure.\n",
   offsetof(struct address, phone));

   return(0);
}  

输出

执行上述代码后,我们得到以下结果:

name offset = 0 byte in address structure.
street offset = 50 byte in address structure.
phone offset = 100 byte in address structure.

示例 2

以下示例说明了 offsetof() 宏的重要性,它对于创建数据结构(链表)很有用。

#include <stdio.h>
#include <stddef.h>

struct Node {
   int data;
   struct Node* next;
};

int main() {
   size_t offset = offsetof(struct Node, data);
   printf("Offset of 'data' in Node: %zu bytes\n", offset);
   return 0;
}

输出

执行上述代码后,我们得到以下结果:

Offset of 'data' in Node: 0 bytes

示例 3

该程序演示了如何使用 offsetof() 宏查找结构体中特定成员的偏移量。

#include <stdio.h>
#define OFFSETOF(TYPE, ELEMENT) ((size_t)&(((TYPE *)0)->ELEMENT))

typedef struct tutorialspoint
{
int i;
double d;
char z;
} tutortype;

int main()
{
   printf("%lu", OFFSETOF(tutortype, z));
   getchar();
   return 0;
}

输出

上述代码产生以下结果:

16
广告