offsetof marco


Reference : http://www.cplusplus.com/reference/cstddef/offsetof/


offsetof 這個marco主要是取的struct的member的相對位置


例如:

struct book {
    char author[8];
    int price ;
    char publisher[20];
}


X+0   +--------------------------+
      +     char author[8]       +
X+8   +--------------------------+

      +     int  price           +
x+12  +--------------------------+
      +     char publisher[20]   +
      +--------------------------+


所以我要找到struct book中的publisher的相對位址只要用offsetof就可以找到了

Example:

   offsetof(struct book, publisher) 會傳回 12


Code: 


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

struct book {
      char author[12];
      int  price ;
      char publisher[20];
};

int main(int argc, const char *argv[])
{
    printf("offset : %d\n",(int)offsetof(struct book, author));
    printf("offset : %d\n",(int)offsetof(struct book, price));
    printf("offset : %d\n",(int)offsetof(struct book, publisher));
    return 0;
}


接著來看這個marco是如何取的struct的member的offset

#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)


((TYPE *)0)這個等同於 (struct book*)0 意思就是取的struct book 的 X+0的這個位置
接著  &(struct book*)0->publisher就是取的publisher的位置接著在轉成(size_t)的型態

以前學C的時候,也不會看到這種寫法 @@ 只有現在想知道linux kernel到底做了什麼才會慢慢一步一步去瞭解每個函數跟marco到底做了什麼。但看懂之後就覺得真好玩 XD




張貼留言

這個網誌中的熱門文章

Unions 在C語言的簡單介紹

解釋scope.$apply用來做什麼? -- AngularJS

JavaScript的Timer用法