• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            天行健 君子當自強而不息

            offsetof宏解析


            今天看代碼時,發現一個有用的東東,offsetof(s,m),這是一個宏,MSDN文檔的說明如下:

            Retrieves the offset of a member from the beginning of its parent structure.

            size_t offsetof(
            structName,
            memberName
            );


            Parameters

            structName
            Name of the parent data structure.


            memberName
            Name of the member in the parent data structure for which to determine the offset.


            Return Value


            offsetof returns the offset in bytes of the specified member from the beginning of its parent data structure. It is undefined for bit fields.

            Remarks

            The offsetof macro returns the offset in bytes of memberName from the beginning of the structure specified by structName. You can specify types with the struct keyword.

            Note


            offsetof is not a function and cannot be described using a C prototype.

            跟蹤代碼發現定義如下:

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

            然后到網上查了一下,發現還真的是很有用,附帶一位大俠的解說:

            struct AAA
            {
                int i;
                int j;
            };

            struct AAA *pAAA;
            pAAA=new AAA;


            這時,pAAA實際上是一個Pointer, 指向某一確定的內存地址,比如0x1234;
            而 pAAA->i 整體是一個int型變量,其地址是&(pAAA->i) ,'&'為取址運算符;
            那么&(pAAA->i)一定等于0x1234,因為i是結構體AAA的第一個元素。
            而&(pAAA->j)一定是0x1234 + 0x4 = 0x1238; 因為sizeof(int) = 4;

            這個做法的巧妙之處就是:它把“0”作為上例中的pAAA,那么 &(pAAA->j)就是j的offset啦。

            解析結果是:
            (s *)0 ,將 0 強制轉換為Pointer to "s"
            可以記 pS = (s *)0 ,pS是指向s的指針,它的值是0;
            那么pS->m就是m這個元素了,而&(pS->m)就是m的地址,而在本例中就是offset啦

            再把結果強制轉換為size_t型的就OK 了,size_t其實也就是int啦!!

            也就是說:

            0 ---> (s *)0

            原來的0是數值類型,現在是結構體指針類型,盡管類型變了,但其值還是不變,也就是說還是0,但這個值的意義變了,現在是地址,而不是數值。

            &(((s *)0)->m)求出字段m的地址值,但由于首地址是0,所以&(((s *)0)->m)求出字段m相對于首地址的偏移值。

            posted on 2007-09-24 19:04 lovedday 閱讀(3761) 評論(0)  編輯 收藏 引用 所屬分類: ▲ C Program

            公告

            導航

            統計

            常用鏈接

            隨筆分類(178)

            3D游戲編程相關鏈接

            搜索

            最新評論

            久久久久99精品成人片牛牛影视 | 久久这里都是精品| 久久夜色精品国产亚洲| 国产成人精品久久二区二区| 亚洲乱码精品久久久久..| 久久精品国产欧美日韩99热| 一本色道久久88综合日韩精品| 无码精品久久一区二区三区 | 国产综合久久久久| 久久精品99久久香蕉国产色戒| 久久久久亚洲AV无码专区体验| 国产精品一区二区久久不卡| 99精品国产在热久久| 99re这里只有精品热久久| 国产精久久一区二区三区| 久久www免费人成看国产片| 亚洲Av无码国产情品久久| 久久99精品久久久大学生| 久久精品毛片免费观看| 伊人久久免费视频| 欧美无乱码久久久免费午夜一区二区三区中文字幕 | 久久ww精品w免费人成| 日本精品久久久中文字幕| 久久久久国产| 无码超乳爆乳中文字幕久久| 97久久精品人妻人人搡人人玩| 国产精品久久久久久久午夜片 | 欧美日韩中文字幕久久久不卡| 噜噜噜色噜噜噜久久| 久久96国产精品久久久| 久久久久久久国产免费看| 久久成人国产精品| 亚洲Av无码国产情品久久| 国产午夜久久影院| 77777亚洲午夜久久多喷| 久久e热在这里只有国产中文精品99| 国产精品久久久久免费a∨| 99久久免费国产精品| 久久精品国产亚洲精品2020| 欧美激情精品久久久久久久| 国内精品久久久久久99蜜桃|