【问题标题】:Size-of struct with uneven 8bit members is not uneven [duplicate]具有不均匀8位成员的结构大小不均匀[重复]
【发布时间】:2017-10-09 10:38:05
【问题描述】:

晚上好!

'遇到以下问题:我有一个多字节和单字节数据类型的输入流,只想将它放在一个结构上。不幸的是,如果我将不均匀数量的 8 位成员与 16 位成员放在一个结构中,sizeof() 函数将使我得到一个偶数长度。

以下示例:

数据类型:

struct uuu { // should contain 5 bytes
    uint8_t a[1];
    uint8_t b[1];
    uint16_t c;
    char d[1];
};
struct ccc { // should contain 5 bytes
    char a;
    char b;
    char c;
    uint16_t d;
};
struct bbb { // should contain 3 bytes
    char a;
    char b;
    char c;
};

片段:

printf("char_bit: %d\n", CHAR_BIT);
printf("%d | %d | %d", sizeof(uuu), sizeof(ccc), sizeof(bbb));

结果:

char_bit: 8
6 | 6 | 3

关键是,我需要一个确切的 8 位成员顺序来将流解析为预定义的结构。有没有办法强制这样做?在 64 位机器上工作,已尝试使用 -m32 gcc 标志进行编译。

我知道这与结构的填充等有关。但是是否有解决方法仍然可以实现固定的结构大小?

提前致谢!

【问题讨论】:

  • 我认为您正在寻找“结构填充”和“对齐”这两个词。这可能会帮助您找到所需的内容。
  • 只需编写代码即可完成您需要的工作。如果你关心结构的大小,那你就做错了。
  • @DavidSchwartz 传入流的结构是预定义的,不是很小,所以使用这种方法比较容易。
  • @TeStUn.De 它被预定义为始终匹配您的编译器碰巧喜欢用作布局或表示的任何内容?而且您只关心完全支持非对齐访问的平台?

标签: c struct 8-bit


【解决方案1】:

如果您使用packed 属性,您的结构将不包含填充。

struct __attribute__((packed)) uuu { // will now contain 5 bytes

【讨论】:

  • 对,因为:语言不做任何保证。作者想要的不是可移植的 C。但在这种情况下,编译器愿意帮他一个忙。
  • Re "作者想要的不是可移植的C",而且有些机器实际上无法访问某些类型,除非它们正确对齐。
  • 这将导致您的访问不对齐,这可能导致您的代码崩溃或以其他方式做错事。
  • @DavidSchwartz 话虽如此,当我阅读一个结构时,我确实倾向于一次阅读一个单独的元素,并通过我正在使用的框架提供转换的 API 运行它们小/大以托管字节序(在 Apple 系统上为 f/e CFSwapInt32LittleToHost())。我因为推荐这样做而受到大喊那个,因为如果您的应用程序适用于 iPhone 或 Windows 或其他一些仅限小端的架构,则您无法在大端上对其进行测试,并且“未经测试的代码是不正确的代码。”所以总会有人投反对票。我只是尝试回答 OP 中提出的问题。 :-/
  • @CharlesSrstka 并不是我认为这很重要,但我的评论是试图确保发布者理解为什么需要__attribute__,以及最初的问题是什么,而不是直接作为批评。我没有投反对票。
猜你喜欢
  • 2021-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-04
  • 2020-04-04
  • 1970-01-01
  • 1970-01-01
  • 2012-06-08
相关资源
最近更新 更多