1 問(wèn)題定義
已知結構體類(lèi)型定義如下:
struct node_t{ char a; int b; int c;};int *p_c,該指針指向struct node_t node的成員變量c
結構體1Byte對齊
#pragma pack(1)求:結構體變量 node的成員變量b的值?
拿到這個(gè)問(wèn)題的時(shí)候,我們先做一下簡(jiǎn)單的分析,題目的意思是根據一個(gè)指向某結構體成員變量的指針,求該結構體的另外一個(gè)成員變量的值。
2 解決方案
那么可能的幾種解法有:
解法一
由于我們知道結構體是1Byte對齊的,所以這道題最簡(jiǎn)單的解法是:
*(int *)((unsigned long)p_c - sizeof(int))成員變量c的地址減去sizeof(int)從而得到成員變量b的地址,然后再強制轉換為int *,最后再取值最終得到成員變量b的值;
解法二
上述代碼雖然簡(jiǎn)單,但擴展性不夠好。我們希望通過(guò)p_c直接得到指向該結構體的指針
p_node,然后通過(guò)p_node訪(fǎng)問(wèn)該結構體的任意成員變量了。
由此我們得到計算結構體起始地址p_node的思路為:
【成員變量c的地址p_c】減去【c在結構體中的偏移】
通過(guò)上一篇的介紹我們得到結構體struct node_t中成員變量c的偏移為:
所以我們得到結構體的起始地址指針p_node為:
最后我們就可以使用下面的代碼來(lái)獲取成員變量a,b的值:
p_node->ap_node->b3 總結
在已知結構體某一個(gè)成員變量的地址的前提下,可以通過(guò)第一講介紹的技巧,快速獲得結構體的起始位置,最終可以得到任意一個(gè)變量的地址。
聯(lián)系客服