91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

container_of 和 offsetof宏

發布時間:2020-07-02 03:20:10 來源:網絡 閱讀:529 作者:onecan2009 欄目:編程語言

在linux 驅動源碼中,有兩個很有意思的宏,分別是offsetof和container_of,他們的作用和定義是這樣子的

  1. offsetof 獲得結構體某成員相對于結構體的偏移長度

    /**
     *   計算的結構體中某成員的偏移量
     */
    #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)

    這個實現很巧妙,相當于設結構體的整體地址設成0,然后它的成員的地址就相當于成員的偏移

    測試代碼:

    #include <stdio.h>
    #include "list.h"
    
    typedef struct Test_struct
    {
            char ca;
            int ib;
            double dc;
    }Test_struct_t;
    
    int main()
    {
    
            printf("offset ca is %d\n",offsetof(Test_struct_t,ca));
            printf("offset ib is %d\n",offsetof(Test_struct_t,ib));
            printf("offset dc is %d\n",offsetof(Test_struct_t,dc));
    
            return 0;
    }

    執行結果:
    offset ca is 0
    offset ib is 4
    offset dc is 8

2.container_of 是通過結構體的某成員的地址得到整個結構體的地址,在使用上進而可以訪問到結構體的其余成員

/**
 * 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) );})

實現上實際就是當前這個成員的地址 減去 這個成員相對整個結構體的的偏移量,就是結構體的地址

測試代碼

typedef struct person
{
    char name[20];
    char phone_num[12];
    int index;
}Person_t;

void showInfo(Person_t *ptr)
{
    printf("name :%s\n",ptr->name);
    printf("phone_num :%s\n",ptr->phone_num);
    printf("index :%d\n",ptr->index);
}
// 通過姓名打印所以信息
void getInfoByName(char name[])
{
    if(!name)
        return ;
    Person_t *ptr = container_of(name,Person_t,name);
    if(ptr)
    {
        showInfo(ptr);
    }
}

int main()
{

    Person_t person;
    memset(&person,0x0,sizeof(Person_t));

    person.index = 110;
    strncpy(person.name,"zhangsan",strlen("zhangsan"));
    strncpy(person.phone_num,"15617274954",strlen("15617274954"));

   showInfo(&person);
   printf("\============\n");
   getInfoByName(&person.name);

    return 0;
}

執行結果
name :zhangsan
phone_num :15617274954
index :110
\============
name :zhangsan
phone_num :15617274954
index :110

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

阿巴嘎旗| 枣阳市| 开封县| 株洲市| 博白县| 河源市| 桂东县| 黄山市| 北票市| 万山特区| 莱芜市| 鞍山市| 库车县| 黄梅县| 青海省| 重庆市| 鹤山市| 普洱| 顺昌县| 铜梁县| 沙雅县| 富锦市| 平顶山市| 漾濞| 怀柔区| 齐齐哈尔市| 宁陵县| 綦江县| 郴州市| 淅川县| 界首市| 绥化市| 图们市| 平江县| 定南县| 同江市| 绿春县| 广饶县| 庄河市| 八宿县| 沈阳市|