请输入您要查询的百科知识:

 

词条 offsetof
释义

offsetof宏的简介

定义

在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("\address of t : %p\address of t.iVal : %p\address of t.iVal2: %p\\", &t, &(t.iVal), &(t.iVal2));

printf("offset of iVal in t: %p\", offsetof(Test, iVal));

printf("offset of iVal2 in t: %p\", offsetof(Test, iVal2));

printf("\address of t2 : %p\address of t2.ch : %p\address of t2.iNum: %p\\", &t, &(t2.ch), &(t2.iNum));

printf("offset of ch in t2: %p\", offsetof(Test2, ch));

printf("offset of iNum in t2: %p\", 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 : 0012FF10

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语言中内存对齐机制。

随便看

 

百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。

 

Copyright © 2004-2023 Cnenc.net All Rights Reserved
更新时间:2025/3/23 3:41:05