相关疑难解决方法(0)

C/C++:强制位域顺序和对齐

我读到结构中位字段的顺序是特定于平台的.如果我使用不同的特定于编译器的打包选项,这将保证数据在写入时以正确的顺序存储吗?例如:

struct Message
{
  unsigned int version : 3;
  unsigned int type : 1;
  unsigned int id : 5;
  unsigned int data : 6;
} __attribute__ ((__packed__));
Run Code Online (Sandbox Code Playgroud)

在具有GCC编译器的英特尔处理器上,字段在显示时显示在内存中.Message.version是缓冲区中的前3位,然后Message.type是.如果我找到各种编译器的等效结构包装选项,这将是跨平台的吗?

c c++ bit-manipulation endianness bit

81
推荐指数
5
解决办法
7万
查看次数

GCC的__attribute __((__ packed__))是否保留原始排序?

目的

我正在用C语言编写一个网络程序(特别是gnu89),我希望通过重新解释一个特定的struct X大字节数组(也就是说char),通过网络发送字节,并struct X在另一方面重新解释它们来简化事情.为此我决定使用gcc的__attribute __((__ packed__)).我已尽最大努力确保正确完成(即我已经考虑了字节序和其他相关问题).

除了保证struct X尽可能小,gcc是否保证struct使用__attribute __((__ packed__))定义的保留原始排序?我已经做了相当多的搜索,我还没有找到关于这种保证是否存在的任何文件.

笔记

可以安全地假设发送方和接收方都不会遇到可移植性问题(例如sizeof(int),在服务器上等于sizeof(int)客户端).

c compiler-construction networking gcc struct

25
推荐指数
2
解决办法
1万
查看次数

在C中使用位字段时的字段顺序

我有一个以下类型的结构

typedef struct
{
unsigned int a : 8;
unsigned int b : 6;
unsigned int c : 2;
}x, *ptr;
Run Code Online (Sandbox Code Playgroud)

我想做的是改变字段c的值.

我做了类似以下的事情

x structure = { 0 };
x->c = 1;
Run Code Online (Sandbox Code Playgroud)

当我查看内存映射时,我希望找到00 01,但我找到00 40.看起来在排列第二个字节时,它将c字段放在最低位中,将b字段放在最高位中.我在GCC和Windows编译器上看过这个.

现在,我做的是以下,这是正常的.

unsigned char ptr2 = (unsigned char*) ptr
*(ptr2 + 1)  &= 0xFC
*(ptr2 + 1)  |= 0x01
Run Code Online (Sandbox Code Playgroud)

我看内存图错了吗?谢谢您的帮助.

c gcc bit-manipulation bit bit-fields

9
推荐指数
3
解决办法
1万
查看次数