乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      根據(jù)成員變量的地址推算出結(jié)構(gòu)體變量的地址

       jijo 2008-11-23
      根據(jù)成員變量的地址推算出結(jié)構(gòu)體變量的地址收藏

      新一篇: 計(jì)算機(jī)科學(xué)領(lǐng)域會(huì)議排名列表 | 舊一篇: 衡量服務(wù)器性能的基準(zhǔn)測試

      我們?cè)跁鴮慍程序的時(shí)候,有時(shí)候需要根據(jù)結(jié)構(gòu)體成員變量的地址,得到結(jié)構(gòu)體的地址,特別是我們想用C來實(shí)現(xiàn)C++的繼承特性的時(shí)候。
      我們對(duì)問題的分析如下:
      • 輸入:一個(gè)結(jié)構(gòu)體定義type,這個(gè)結(jié)構(gòu)體中某個(gè)成員變量的名字member以及它的地址ptr
      • 輸出:包含此成員變量的結(jié)構(gòu)體的地址
      為了便于分析,我們給出一個(gè)實(shí)例來說明
      struct father_t {
      int a;
      char *b;
      double c;
      }f;
      char *ptr = &(f.b);
      //而不是 ptr = f.b; 這里ptr是b的地址,而不是它指向的地址。
      根據(jù)C語言對(duì)struct類型的存儲(chǔ)特性,我們可以畫這么一個(gè)圖示:
      container_of
      通過分析圖示,我們可以看出,我們只需要把當(dāng)前知道的成員變量的地址ptr,減去它在結(jié)構(gòu)體當(dāng)中相對(duì)偏移4就的到了結(jié)構(gòu)體的地址(ptr-4)。
      在linux當(dāng)中對(duì)此有一個(gè)很好的宏可以使用,叫做 container_of, 放在 linux/kernel.h當(dāng)中。它的定義如下所示:
      /**
      * container_of - cast a member of a structure out to the containing structure
      *
      * @ptr: the pointer to the member.
      * @type: the type of the container struct this is embedded in.
      * @member: the name of the member within the struct.
      *
      */
      #define container_of(ptr, type, member) ({
      const typeof( ((type *)0)->member ) *__mptr = (ptr);
      (type *)( (char *)__mptr - offsetof(type,member) );})

      #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
      對(duì)上面的定義,分析如下:
      1. (type *)0->member為設(shè)計(jì)一個(gè)type類型的結(jié)構(gòu)體,起始地址為0,編譯器將結(jié)構(gòu)體的起始的地址加上此結(jié)構(gòu)體成員變量的偏移得到此結(jié)構(gòu)體成員變 量的偏移地址,由于結(jié)構(gòu)體起始地址為0,所以此結(jié)構(gòu)體成員變量的偏移地址就等于其成員變量在結(jié)構(gòu)體內(nèi)的距離結(jié)構(gòu)體開始部分的偏移量。即:&((type *)0->member)就是取出其成員變量的偏移地址。而其等于其在結(jié)構(gòu)體內(nèi)的偏移量:即為:(size_t)(& ((type *)0)->member)經(jīng)過size_t的強(qiáng)制類型轉(zhuǎn)換后,其數(shù)值為結(jié)構(gòu)體內(nèi)的偏移量。該偏移量這里由offsetof()求出。
      2. typeof(((type *)0)->member)為取出member成員的變量類型。用其定義__mptr指針。ptr為指向該成員變量的指針。__mptr為member數(shù)據(jù)類型的常量指針,其指向ptr所指向的變量處。
      3. (char*)__mptr轉(zhuǎn)換為字節(jié)型指針。(char*)__mptr - offsetof(type,member))用來求出結(jié)構(gòu)體起始地址(為char *型指針),然后(type*)(char*)__mptr - offsetof(type,member))在(type *)作用下進(jìn)行將字節(jié)型的結(jié)構(gòu)體起始指針轉(zhuǎn)換為type *型的結(jié)構(gòu)體起始指針。
      這就是從結(jié)構(gòu)體某成員變量指針來求出該結(jié)構(gòu)體的首指針。指針類型從結(jié)構(gòu)體某成員變量類型轉(zhuǎn)換為該結(jié)構(gòu)體類型。 

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多