欢迎访问服务百科信息网!
首页 >科技 >offsetof
offsetof

offsetof

(用于求结构体偏移量的程序语言)
offsetof,程序语言,该宏用于求结构体中一个成员在该结构体中的偏移量。
offsetof资料
  • 外文名:offsetof
  • 领域:计算机
  • 性质:函数类型
  • 定义

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

    #ifdef __cplusplus

    #ifdef _WIN64

    #define offsetof(s,m) (size_t)( (ptrdiff_t)&reinterpret_cast((((s *)0)->m)) )

    #else

    #define offsetof(s,m) (size_t)&reinterpret_cast((((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

    #include

    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: %d\n", offsetof(Test, iVal));

    printf("offset of iVal2 in t: %d\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: %d\n", offsetof(Test2, ch));

    printf("offset of iNum in t2: %d\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语言中内存对齐机制。

  • 上一篇百科:SIP协议栈
  • 下一篇百科:memcpy