C語言 結構體中屬性的偏移量計算


//計算結構體偏移量

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//詳解:對於offscfof()函數,
//(TYPE *)0這句的意思是將內存地址是0內存塊轉換成一個TYPE類型的指針
//那么此時0地址的指針的步長就是TYPE,
//(TYPE *)0)->MEMBER這句話是取TYPE結構體的MEMBER屬性(注意此時TYPE結構體的指針的值是0)
//&((TYPE *)0)->MEMBER,&就是取地址的運算符,這句話的意思是取TYPE結構體的MEMBER屬性的地址
//(size_t)就是強轉成size_t類型,因為此時結構體的指針的值是0,強轉成Int型,恰巧就是MEMBER在結構體的偏移量
#define offscfof(TYPE,MEMBER) ((size_t)&((TYPE *)0)->MEMBER)

//詳解:對於container_of()函數,
//offscfof(type,member)是該屬性在結構體中的偏移量
//ptr是member屬性在內存中的實際地址,為什么要將ptr強轉成char *類型呢?
//這是由於指針加減的特殊性決定的 比如 (int *)ptr-1,指針會向上移動4個字節,(char *)ptr-1 指針會向上移動1個字節
//指針是有步長的,不能是簡單的加減,偏移量就是偏移的字節數,所以強轉成char *類型正好
#define container_of(ptr,type,member) (type *)((char *)ptr-offscfof(type,member))


typedef struct _student1{
    int num;
    char name[20];
    int pNext;
}Student1;

void main(){
    int res = 0;
    Student1 a;
    res = (int)container_of(&a.pNext,Student1, pNext);
    printf("Student1的地址%d\n", sizeof(a));
    printf("Student1的地址%x\n",&a);
    printf("Student1的地址%x\n", res);
    system("pause");
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM