目的
我正在用C语言编写一个网络程序(特别是gnu89),我希望通过重新解释一个特定的struct X大字节数组(也就是说char),通过网络发送字节,并struct X在另一方面重新解释它们来简化事情.为此我决定使用gcc的__attribute __((__ packed__)).我已尽最大努力确保正确完成(即我已经考虑了字节序和其他相关问题).
题
除了保证struct X尽可能小,gcc是否保证struct使用__attribute __((__ packed__))定义的保留原始排序?我已经做了相当多的搜索,我还没有找到关于这种保证是否存在的任何文件.
笔记
可以安全地假设发送方和接收方都不会遇到可移植性问题(例如sizeof(int),在服务器上等于sizeof(int)客户端).
有人提供一个示例是否会因为错位而将指针从一种类型转换为另一种类型失败?
在对这个答案的评论中,两者都表示做了类似的事情
char * foo = ...;
int bar = *(int *)foo;
Run Code Online (Sandbox Code Playgroud)
如果启用了对齐检查,即使在x86上也可能导致错误.
我set $ps |= (1<<18)在GDB中设置对齐检查标志后尝试生成错误条件,但没有任何反应.
工作(即非工作;))示例是什么样的?
答案中没有任何代码片段在我的系统上失败 - 我将尝试使用不同的编译器版本,稍后在不同的PC上.
顺便说一句,我自己的测试代码看起来像这样(现在也使用asm来设置AC标志和未对齐的读写):
#include <assert.h>
int main(void)
{
#ifndef NOASM
__asm__(
"pushf\n"
"orl $(1<<18),(%esp)\n"
"popf\n"
);
#endif
volatile unsigned char foo[] = { 1, 2, 3, 4, 5, 6 };
volatile unsigned int bar = 0;
bar = *(int *)(foo + 1);
assert(bar == 0x05040302);
bar = *(int *)(foo + 2);
assert(bar == 0x06050403);
*(int …Run Code Online (Sandbox Code Playgroud)