淘先锋技术网

首页 1 2 3 4 5 6 7

一、函数原型

#include <stddef.h>
size_t offsetof(type, member);

offsetof原型定义:define offsetof(t,m) ((size_t)&((t *)0)->m)
在这里插入图片描述
1、关于&((t *)0)的解释

1-1(type *) 0作用是强制类型转换,将0转换为(type*)类型,一个type指针类型
1-2:编译器在会将 &((t *)0) 优化为直接取地址,因为这种表达是: 先访问空间, 再取空间的地址,就相当于直接取地址。

2、注意:组成结构的字段的大小在不同的实现中可能不同,编译器可能在字段之间插入不同数量的填充字节。因此,元素的偏移量不一定是前面元素大小的总和。

二、函数demon,截取自man手册

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

int main(void)
{
	struct s {
		int i;
		char c;
		double d;
		char a[];
	};

	/* Output is compiler dependent */

	printf("offsets: i=%ld; c=%ld; d=%ld a=%ld\n",
			(long) offsetof(struct s, i),
			(long) offsetof(struct s, c),
			(long) offsetof(struct s, d),
			(long) offsetof(struct s, a));
	printf("sizeof(struct s)=%ld\n", (long) sizeof(struct s));

	exit(EXIT_SUCCESS);
}

在这里插入图片描述