词条 | 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条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。