-1

我有两个结构:

Struct _size1 {
    union{
           short a;
           struct {
                    char b;
                    char c;
            }d;
            struct {
                     char x; 
                     char y;
            }z;
     };

     union{
            short a1;
            struct {
                    char b1;
                    char c1;
            }d1;
            struct {
                     char x1; 
                     char y1;
            }z1;
      };
}size1;

和:

Struct _size2 {
    short num; //2 bytes
    short num2; //2 bytes
    short num3; //2 bytes
    size1 st_size; //4 bytes

}size2;

sizeof(size1) = 4; sizeof(size2) = 12;

我试图获得的尺寸是 size2 的 10。

它在 num3 和 st_size 之间添加两个字节的填充。Microblaze 编译器不支持 Pragma Pack

我正在尝试使用属性((packed)) 但没有任何成功...

Struct _size2 {
    short num; //2 bytes
    short num2; //2 bytes
    short num3; //2 bytes
    size1 st_size; //4 bytes

}size2 __attribute__((packed));

我不确定出了什么问题,或者这是否有效。

谢谢

4

2 回答 2

1

unsigned int在 gcc / Microblaze 上使用的是 4 字节的位字段类型。

使用 gcc 实现定义的unsigned short位域类型,在 gcc / Microblaze 中具有 2 个字节的大小。

于 2012-08-06T18:18:44.513 回答
0

我在我的一个头文件中成功地使用它来描述以太网头:

struct eth_hdr_st {
    unsigned char dst_addr[6];
    unsigned char src_addr[6];
    unsigned short datatype;
} __attribute__ ((__packed__));

然后我像这样使用它:

struct eth_hdr_st eht_header;

请注意,第一部分是名为 的结构的结构定义eth_hdr_st;第二部分是一个名为eth_header, 类型的变量的声明struct eth_hdr_st

您的代码中的问题是您将这些部分混合在一起,并试图应用于__attribute__((packed))名为size2.

于 2018-08-10T14:04:31.043 回答