offsetof宏的简介

offsetof宏的简介

作者:admin |  时间:2014-02-09 |  浏览:486 |  0 条评论

定义

在stddef.h头文件中,该宏的完整说明如下:

#ifdef __cplusplus
#ifdef _WIN64
#define offsetof(s,m) (size_t)( (ptrdiff_t)&reinterpret_cast<const volatile char&>((((s *)0)->m)) )
#else
#define offsetof(s,m) (size_t)&reinterpret_cast<const volatile char&>((((s *)0)->m))
#endif
#else
#ifdef _WIN64
#define offsetof(s,m) (size_t)( (ptrdiff_t)&(((s *)0)->m) )
#else
#define offsetof(s,m) (size_t)&(((s *)0)->m)
#endif
#endif /* __cplusplus */

功能

该宏用于求结构体中一个成员在该结构体中的偏移量。
在msdn上,该宏被写作:
size_t offsetof( structName, memberName );
第一个参数是结构体的名字,第二个参数是结构体成员的名字。该宏返回结构体structName中成员memberName的偏移量。偏移量是size_t类型的。

程序示例

#include <stdio.h>
#include <stddef.h>
typedef struct
{
  int iVal;
  int iVal2;
}Test;
typedef struct
{
  char ch;
  int iNum;
}Test2;
int main(void)
{
  Test t = {1, 2};
  Test2 t2 = {'t', 100};
  printf("\naddress of t : %p\naddress of t.iVal : %p\naddress of t.iVal2: %p\n\n", &t, &(t.iVal), &(t.iVal2));
  printf("offset of iVal in t: %p\n", offsetof(Test, iVal));
  printf("offset of iVal2 in t: %p\n", offsetof(Test, iVal2));
  printf("\naddress of t2 : %p\naddress of t2.ch : %p\naddress of t2.iNum: %p\n\n", &t, &(t2.ch), &(t2.iNum));
  printf("offset of ch in t2: %p\n", offsetof(Test2, ch));
  printf("offset of iNum in t2: %p\n", offsetof(Test2, iNum));
  return 0;
}

在VS2005中输出:
address of t : 0012FF10
address of t.iVal : 0012FF10
address of t.iVal2: 0012FF14
offset of iVal in t: 00000000
offset of iVal2 in t: 00000004
address of t2 : 0012FF00
address of t2.ch : 0012FF00
address of t2.iNum: 0012FF04
offset of ch in t2: 00000000
offset of iNum in t2: 00000004
需要注意的是,Test2中iNum成员的偏移量是4而不是1,这涉及到C语言中内存对齐机制。

相关推荐

git代码发布系统常用命令总结
Posted on 03月15日
git查看某个文件的修改历史
Posted on 10月12日
PHP实现文件下载功能
Posted on 08月17日
linux 查看文件16进制
Posted on 04月03日

发表评论

电子邮件地址不会被公开。

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>