LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: kiron

请教unsigned char payload[0]有什么作用?

[复制链接]
发表于 2005-6-29 15:53:29 | 显示全部楼层
这是一个取得结构成员偏移量的技巧。

http://www.linuxforum.net/forum/ ... sb=&o=&vc=1
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-6-30 10:03:53 | 显示全部楼层
C真是博大精深啊.

受各位兄弟教导,谢谢.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-6-30 10:33:03 | 显示全部楼层
Post by dieken_qfz
像 T  a[0];这样的东西,第一,可以自动申请到一块内存(sizeof(T)),第二,可以方便的使用
一个指针a.
// 说错了, 应该是T a[1]这样的用法

我猜这个域是用来判断ip包的负载类型并且引用负载数据, 比如一个包含了tcp数据的ip包
xxxxxxxxxxYzzzzzzzzzzzzzz
\-------------/ \----------------/
ip-header      ip-payload(tcp)
这样用payload[0]可以判断这个负载的类型, 而且可以用payload[1] ... payload[data_len]
引用tcp包, 中间不用为了一个char而跑到堆中单独分配一次内存, 又要释放.
  1. #include <stdio.h>

  2. int
  3. main(void)
  4. {
  5.   char a[0];
  6.   char b[1];

  7.   printf("size of type is %d\n", sizeof(char));
  8.   printf("a[0] sizeof is %d\nb[1] sizeof is %d\n", sizeof(a),sizeof(b));
  9.   exit(0);
  10. }
复制代码

dieken_qfz兄那个T a[0]申请的内存大小不是sizeof(T),而是0,应该说是申请到一个指针,指针指的T对象大小为零.


Tetries兄弟的这个写法:
ipq_packet_msg_t *packet = malloc(offsetof(ipq_packet_msg_t) + payload_size);
应该是ipq_packet_msg_t *packet = malloc(offsetof(ipq_packet_msg_t,payload[1]) + payload_size);
这样可以在payload[1]....payload[payload_size]里保存IP包
但我们会在payload[0]里保存什么呢? :ask
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表