国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
offset宏的使用
筆試題中經(jīng)常會碰到這樣一個題目,已知結(jié)構(gòu)體實例某個成員的地址,然后求該結(jié)構(gòu)體實例的地址。寫了個小程序做測試;
下面這一段話總結(jié)的比較好,轉(zhuǎn)載過來學習學習;
   假設(shè)存在一個虛擬地址0,將該地址強制轉(zhuǎn)換成為該結(jié)構(gòu)體指針類型(struct stru_name*)0。那么地址0開始到sizeof(struct)-1長度的內(nèi)存區(qū)域就可以視為一個結(jié)構(gòu)體的內(nèi)存。地址向上增長。這樣結(jié)構(gòu)體中任何一個元素都可以通過對該結(jié)構(gòu)體指針解引用得到。由于該結(jié)構(gòu)體的起始地址為0, 因此任何一個成員的地址應(yīng)該等于其相對于結(jié)構(gòu)體起始地址的偏移,這也就是計算偏移量的方法:(unsigned long)&((struct stru_name*)0)->element。

根據(jù)上述緣由,編寫程序如下:
#include <stdio.h>

#define offsetof(s,m) (unsigned long)&(((s *)0)->m)
 //->的優(yōu)先級比&要高

struct list{
 char a;
 int b;
 short c;
};

typedef struct list List;

int main()
{
 unsigned char *child = NULL;
 unsigned char *owner = NULL;
 unsigned char *final = NULL;

 List test;
 child = (unsigned char *)&(test.b);//將地址轉(zhuǎn)換為unsigned char *型的指針,賦給child
 owner = (unsigned char *)&test;
 printf("the address of struct is %p\n",owner);
 printf("the address of b is %p\n",child);
 unsigned long offset = offsetof(List,b);
 printf("offset is %p\n",offset);
 final = (unsigned char *)child - offset;//結(jié)構(gòu)成員的地址減去偏移值,得到結(jié)構(gòu)體實例的起始地址。
 printf("after sub offset,the struct address is %p\n",final);
 return 0;
}

 
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
ANSI C中取得結(jié)構(gòu)體字段偏移量的常用方法
C語言之結(jié)構(gòu)體就這樣被攻克了!
面試???,項目易錯,長文詳解C/C 中的字節(jié)對齊
內(nèi)存對齊
Linux進程的虛擬地址空間
深入理解C語言內(nèi)存對齊
更多類似文章 >>
生活服務(wù)
分享 收藏 導長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服