当前位置: 技术问答>linux和unix
对一个结构体取下标 是什么结果?
来源: 互联网 发布时间:2016-10-30
本文导语: 如下: wh = (struct ieee80211_frame *) skb->data; frm = (u_int8_t *)&wh[1]; wh是一个结构体指针啊 wh[1] 表示的是什么意思? frm表示的是什么意思? 没看懂 --------------------------------------------------------------------- ...
如下:
wh = (struct ieee80211_frame *) skb->data;
frm = (u_int8_t *)&wh[1];
wh是一个结构体指针啊
wh[1] 表示的是什么意思?
frm表示的是什么意思?
没看懂
---------------------------------------------------------------------
struct ieee80211_frame {
u_int8_t i_fc[2];
u_int8_t i_dur[2];
u_int8_t i_addr1[IEEE80211_ADDR_LEN];
u_int8_t i_addr2[IEEE80211_ADDR_LEN];
u_int8_t i_addr3[IEEE80211_ADDR_LEN];
u_int8_t i_seq[2];
/* possibly followed by addr4[IEEE80211_ADDR_LEN]; */
/* see below */
} __packed;
-----------------------------------------------------------------------
wh = (struct ieee80211_frame *) skb->data;
frm = (u_int8_t *)&wh[1];
wh是一个结构体指针啊
wh[1] 表示的是什么意思?
frm表示的是什么意思?
没看懂
---------------------------------------------------------------------
struct ieee80211_frame {
u_int8_t i_fc[2];
u_int8_t i_dur[2];
u_int8_t i_addr1[IEEE80211_ADDR_LEN];
u_int8_t i_addr2[IEEE80211_ADDR_LEN];
u_int8_t i_addr3[IEEE80211_ADDR_LEN];
u_int8_t i_seq[2];
/* possibly followed by addr4[IEEE80211_ADDR_LEN]; */
/* see below */
} __packed;
-----------------------------------------------------------------------
|
skb->data 里面存储的是以struct ieee80211_frame数据结构组成的数据块,假定有5块,那就是skb->data有 5 * sizeof(struct ieee80211_frame) 这么多的数据。
wh 是struct ieee80211_frame 的一个指针,
frm = (u_int8_t *)&wh[1];
是指 指向skb->data 里面第二个struct ieee80211_frame 的数据块。
skb->data 由下面组成
ieee80211_frame(0) + ieee80211_frame(1) + ieee80211_frame(2) + ieee80211_frame(3) + ieee80211_frame(4)
frm 指向ieee80211_frame(1)这个数据块
另外,建议你先把 C/C++ 学好再来学习 linux 内核的东西。
wh 是struct ieee80211_frame 的一个指针,
frm = (u_int8_t *)&wh[1];
是指 指向skb->data 里面第二个struct ieee80211_frame 的数据块。
skb->data 由下面组成
ieee80211_frame(0) + ieee80211_frame(1) + ieee80211_frame(2) + ieee80211_frame(3) + ieee80211_frame(4)
frm 指向ieee80211_frame(1)这个数据块
另外,建议你先把 C/C++ 学好再来学习 linux 内核的东西。
|
我重新分析一下!
wh = (struct ieee80211_frame *) skb->data;
frm = (u_int8_t *)&wh[1];
1、第一句中skb->data这句很简单,取skb结构体里面的data元素,毫无疑问,data应该是个数组,至于这个数组中元素的类型是什么?那就不得而知了!
2、将skb->data强制转换成指向struct ieee80211_frame结构体的指针,同时赋值给wh,wh类型也是指向该结构体的指针!
3、wh[1] = *(wh + 1); 其中的1,表示wh指向的元素的大小!亦即sizeof(struct ieee80211_frame);这么大!从上面可求出这个size!
4、frm的类型应该是u_int8_t类型的一个指针!此时的wh[1]是wh指向的第二个struct ieee80211_frame元素!&wh[1]就表示第二个元素的地址!接着将这个地址强制转换成指向u_int8_t类型的指针!
综上:wh可看成是一个一维数组!数组内存放的元素类型为struct ieee80211_frame!
wh[1]就是数组中的第二个元素!&wh[1]就是第二个元素的地址!
I think it's so clear!!