我正在尝试下面的方法,在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都出现了这个问题。
发布于 2015-01-08 19:54:09
您将属性放在了错误的位置-请尝试以下操作:
struct st { char c;
int x __attribute__ ((packed));
};根据gcc手册中的示例,这将导致x被打包为紧跟在c之后。
当然,从一开始你就不应该这样做,因为你的代码会在某些架构上崩溃,即使在它没有崩溃的地方,也可能会有性能损失。
发布于 2015-01-09 17:25:44
在我的环境下,Centos 5.11 (64位)在你提到的第一种情况下打印5。
gcc 4.9.1版(GCC)
gcc文件.c
./a.out 5
https://stackoverflow.com/questions/27839287
复制相似问题