对一个结构体取下标 是什么结果?

Mr. 小萝卜 2010-12-19 09:20:05
如下:

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;
-----------------------------------------------------------------------
...全文
375 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
louyong0571 2010-12-23
  • 打赏
  • 举报
回复
it's so clear
fishly_0 2010-12-23
  • 打赏
  • 举报
回复
如果你能知道wh是什么指针,你就知道wh[1]表示什么内容。
  • 打赏
  • 举报
回复

我重新分析一下!
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!!
dfysy 2010-12-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 leeyiqun 的回复:]
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 里面第二个……
[/Quote]
这老兄说的才是对的,#2和#3楼的说法是不正确的
lover4ever 2010-12-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 leeyiqun 的回复:]

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 里面第二……
[/Quote]
+1
  • 打赏
  • 举报
回复
wh是一个结构体指针啊
wh[1] 表示的是什么意思?
frm表示的是什么意思?
===================
wh是一个结构体指针,那么wh[1]就应该是第4个字节!wh[1] = *(wh + 1); 这个1就是sizeof(wh);wh是指针,所以就是4了!
tarantula 2010-12-19
  • 打赏
  • 举报
回复
神仙,基本c都没有学好,就去看linux内核,牛人,好好学下基本c吧,这些都是基本的指针操作,另,wh[1]是skb->data的第二个字节,呵呵
leeyiqun 2010-12-19
  • 打赏
  • 举报
回复
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 内核的东西。
jianmin09 2010-12-19
  • 打赏
  • 举报
回复
wh[1]表示skb->data内第一个字节。
小魔菇 2010-12-19
  • 打赏
  • 举报
回复
协议头

23,118

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧