LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 645|回复: 9

union的问题。

[复制链接]
发表于 2005-8-27 11:47:14 | 显示全部楼层 |阅读模式

  1. struct msghdr1 {
  2.    int id;
  3.    int type:
  4.    unsigned char payload[0];
  5. };

  6. struct msghdr2 {
  7.    int id;
  8.    int type;
  9.    int src;
  10.    int dest;
  11.    unsigned char payload[0];
  12. };

  13. struct nl_msg {
  14.    union {
  15.       struct msghdr1 h1;
  16.       struct msghdr2 h2;
  17.    } u;
  18.    unsigned char data[128];
  19. };
复制代码


有没有什么属性可以使union里的成员占用的内存向后靠。
发表于 2005-8-27 15:31:09 | 显示全部楼层
何谓向后靠,能否举个例子说一下?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-27 16:24:08 | 显示全部楼层
以上面的代码为例
struct nl_msg p;
p.u.hd1.payload == p.u.hd2.payload == u.payload
回复 支持 反对

使用道具 举报

发表于 2005-8-27 21:07:29 | 显示全部楼层
Post by daemeon
以上面的代码为例
struct nl_msg p;
p.u.hd1.payload == p.u.hd2.payload == u.payload

大概明白你的意思了,你是想要让payload靠着后面的data,然后操作payload就像操作data一样了,是吗?
但是这样有必要吗? 你那两个包含 payload 的结构大小是可变的,势必会使nl_msg后面的成员变量受影响,如果我是编译器,我根本不会让你这样的结构通过,正如不让下面的结构通过一样:

  1. struct S
  2. {
  3.     char buf[0];
  4.     int i;
  5. };
复制代码

你完全可以就直接用那个data,而把前面两个结构的 payload 域去掉,这样岂不是更好?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-27 21:24:40 | 显示全部楼层
Post by rickxbx


  1. struct S
  2. {
  3.     char buf[0];
  4.     int i;
  5. };
复制代码



编译可以通过的,内核中有很多地方都用了这种方法。
我想这样做是因为用netlink socket和内核通讯,接收数据时消息头和发送数据时的消息头不一样,消息头后面的数据是一样的。
回复 支持 反对

使用道具 举报

发表于 2005-8-27 21:42:24 | 显示全部楼层
Post by daemeon
编译可以通过的,内核中有很多地方都用了这种方法。
我想这样做是因为用netlink socket和内核通讯,接收数据时消息头和发送数据时的消息头不一样,消息头后面的数据是一样的。

呵呵,记得以前试过那样是不行的,估计是在 vc.net 上的,那东西好久不用了,gcc 果真可以呢.
这样的话,可以考虑在第一个结构(就是那个比较小的结构)前面填充一些东西,反正又不会浪费空间.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-27 21:51:16 | 显示全部楼层
问题是那些结构不是我定义的,看来只有拷贝一次数据了。
回复 支持 反对

使用道具 举报

发表于 2005-8-27 22:01:55 | 显示全部楼层
不是你定义,但是你能修改吗?
如果不能修改,就算有属性可以达到你刚开始提的要求,也没办法啊
如果能修改,那就可以先用padding的方法做.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-27 22:37:33 | 显示全部楼层
那些结构是内核的头文件中定义的。

如果有属性达到我的要求。接收数据时用recv(socfd, &p.u.hd1, ...),发送数据时用send(sockfd, &p.u.hd2, ...)
回复 支持 反对

使用道具 举报

发表于 2005-8-28 08:22:09 | 显示全部楼层
哦,如此啊.总算明白你的意思了
这样的话,你可以自己定义两个数据结构啊,不要用内核给的
回复 支持 反对

使用道具 举报

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

本版积分规则

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