我正在将一个C语言应用程序移植到ARM平台,该应用程序还可以在x86处理器上运行,并且必须向后兼容。
我现在遇到一些变量对齐的问题。我已经阅读了GCC手册中关于__attribute__((aligned(4),packed))
的说明,我理解它的意思是结构体的开始会按照4字节边界对齐,而内部由于有packed声明会保持不变。
最初我用了这个方法,但是有时候它并没有按照4字节边界对齐。
typedef struct
{
unsigned int code;
unsigned int length;
unsigned int seq;
unsigned int request;
unsigned char nonce[16];
unsigned short crc;
} __attribute__((packed)) CHALLENGE;
所以我把它改成了这样。
typedef struct
{
unsigned int code;
unsigned int length;
unsigned int seq;
unsigned int request;
unsigned char nonce[16];
unsigned short crc;
} __attribute__((aligned(4),packed)) CHALLENGE;
我之前提到的理解似乎是错误的,因为结构体现在已经对齐到了4字节边界,并且内部数据也已经对齐到了四字节边界,但由于大小端的原因,结构体的大小从42字节增加到44字节。这个大小很关键,因为我们有其他依赖于结构体大小为42字节的应用程序。
请问有人能告诉我如何执行我需要的操作吗?非常感谢任何帮助。
&struct_obj
作为 char 数组。如果他想放弃紧凑性,则可能需要---暂时。但即使在这种情况下,我也只会使用缓冲操作(例如 FILE)并读取每个成员。 - Roger Pate