我是否误解了GCC中的属性(打包)?

我是否误解了GCC中的属性(打包)?,c,gcc,struct,C,Gcc,Struct,我正在使用win32上的gcc尝试以下操作 #include <stdio.h> struct st { char c; int x; } __attribute__ ((packed)); int main() { printf("%d\n", sizeof(struct st)); return 0; } #包括 结构st{char c;int x;}uuu属性_uu((压缩)); int main(){ printf(“%d\n”,sizeof(struc

我正在使用win32上的gcc尝试以下操作

#include <stdio.h>

struct st { char c; int x; } __attribute__ ((packed));

int main() {
    printf("%d\n", sizeof(struct st));
    return 0;
}
#包括
结构st{char c;int x;}uuu属性_uu((压缩));
int main(){
printf(“%d\n”,sizeof(struct st));
返回0;
}
我希望打印值是5,但它是8

然而,通过以下步骤,我得到了5

#include <stdio.h>

#pragma pack(1)
struct st { char c; int x; };

int main() {
    printf("%d\n", sizeof(struct st));
    return 0;
}
#包括
#布拉格语包(1)
结构st{char c;int x;};
int main(){
printf(“%d\n”,sizeof(struct st));
返回0;
}
我的程序一定有问题,但我看不出有什么问题。 我已经读了很多关于这方面的文章和问题,但我仍然感到困惑。有什么提示吗

同样从这些问题的答案来看,我明白我不应该使用压缩结构,我可能不会经常使用它,但我仍然想理解我在这么短的程序中看不到的东西


注意:gcc-4.9.2和gcc-4.8.4都存在此问题。

您的属性位于错误的位置-请尝试以下操作:

struct st { char c;
            int x __attribute__ ((packed));
          };
根据gcc手册中的示例,这将导致对
x
进行打包,使其紧跟在
c
之后


当然,您不应该一开始就这样做,因为您的代码在某些体系结构上会中断,即使没有中断,也可能会导致性能下降。

在我的环境Centos 5.11(64位)上运行良好 你提到的第一个病例打印了5张

gcc版本4.9.1(gcc)

gcc文件.c

五,


对我来说这很有效@Jayesh好的,那么,我有来自的gcc-4.9.2,也许这是这个版本的问题?首先,你应该写%lu而不是%d@yakoudbz这将在编译时引发警告:
警告:格式“%lu”要求参数类型为“long unsigned int”,但参数2的类型为“unsigned int”
。但是,我同意%d应替换为%u。当然,它也不能解决问题。@Nivak可能会,也可能不会。但是您可以在这里查找OP的代码,因为OP的代码对我很有用,所以将
\uuuu属性\uuuuu((打包))
放在末尾应该是fine@Gopi,我不确定:packed属性指定变量或结构字段应该具有最小的对齐方式,一个变量一个字节,一个字段一个位,除非您用aligned属性指定一个更大的值。@AlterMann和@PaulR根据我在网上找到的所有内容,它应该在struct之后工作(或者甚至在struct uu属性之前,如
struct uu((packed))st{char c;int x;};
)。但见上面Jayesh的评论,我认为这是一个bug。@PaulR我只会将其用于编组,但寻找答案时,我发现,实际上即使是这样,我也不应该。。。我对此没意见,但我想了解这个属性是如何工作的,以防万一。打包属性可以放在变量或结构字段上,记录在这里:也可以放在结构上,记录在这里:。根据Jayesh的说法,这是mingw的问题。我使用mingw-w64在和中重现了gcc-4.8.4或gcc-4.9.2的相同问题。谢谢你的回答。
./a.out