LinuxSir.cn,穿越时空的Linuxsir!

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

关于sizeof和结构体大小

[复制链接]
发表于 2005-8-24 18:56:13 | 显示全部楼层
struct s 的大小应该是你已知的,你可以用一个宏来代替它就好了。
#define SIZE_S 6
不就可以了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-24 19:20:18 | 显示全部楼层
也只能手动数数了
回复 支持 反对

使用道具 举报

发表于 2005-8-24 20:53:20 | 显示全部楼层
Post by lollipop
struct s 的大小应该是你已知的,你可以用一个宏来代替它就好了。
#define SIZE_S 6
不就可以了

你忽略了一个问题,如果 struct s 如下定义:
struct s
{
    short s;
    int i;
};

就会出问题,如果只像网络发送 6 个字节显然是不对的.发送的只是 s 占用的四字节与 i 占用的低两字节
回复 支持 反对

使用道具 举报

发表于 2005-8-25 00:19:56 | 显示全部楼层
楼上的说的有道理,这点没有想到...
实际的代码是怎么来做的?
按9楼的说法?
回复 支持 反对

使用道具 举报

发表于 2005-8-25 09:12:32 | 显示全部楼层
Post by lollipop
楼上的说的有道理,这点没有想到...
实际的代码是怎么来做的?
按9楼的说法?

有这种可能,当然,也可能就用pack,像下面这样:

  1.      49 struct  tftphdr {
  2.      50     short   th_opcode;          /* packet type */
  3.      51     union {
  4.      52         unsigned short  tu_block;   /* block # */
  5.      53         short   tu_code;        /* error code */
  6.      54         char    tu_stuff[1];        /* request packet stuff */
  7.      55     } __attribute__ ((__packed__)) th_u;
  8.      56     char    th_data[1];         /* data or error string */
  9.      57 } __attribute__ ((__packed__));
复制代码
回复 支持 反对

使用道具 举报

发表于 2005-8-25 09:15:28 | 显示全部楼层
Post by marvel
谢谢,但是在什么情况下会出现这种问题呢?
难道每个结构体都需要加这句吗?

加上 -fpack-struct 编译选项可以省去在每个struct后加上 __attribute__((packed)) 的麻烦,不过这样会不会带来问题就很难说了,可能会使本来不应该对齐的结构也对齐了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-25 12:05:22 | 显示全部楼层
hehe ,We get to the place where we were
回复 支持 反对

使用道具 举报

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

本版积分规则

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