我正在尝试以下方法,在win32上使用gcc。
#include <stdio.h>
struct st { char c; int x; } __attribute__ ((packed));
int main() {
printf("%d\n", sizeof(struct st));
return 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;
}
我的程序肯定有问题,但我看不清楚。 我已经阅读了gcc's manual以及有关此问题的几个问题,我仍然感到困惑。任何提示?
同样从SO的这些问题的答案,我明白我不应该使用marshalling的打包结构,我可能不会使用它,但我仍然想了解我是什么无法在如此短的节目中看到。
注意:gcc-4.9.2和gcc-4.8.4都会出现问题。
答案 0 :(得分:2)
你的属性位置错误 - 试试这个:
struct st { char c;
int x __attribute__ ((packed));
};
根据gcc手册中的示例,这将导致x
被打包,使其紧跟c
。
当然,你不应该首先这样做,因为你的代码会破坏某些架构,即使它没有中断,也可能会有性能损失。
答案 1 :(得分:0)
在我的环境中正常工作Centos 5.11(64位) 为你提到的第一个案例打印5个。
gcc版本4.9.1(GCC)
gcc file.c
./a.out
5