【问题标题】:reinterpret_cast/type punning functionality in C with unions [closed]带有联合的 C 中的 reinterpret_cast/type punning 功能[关闭]
【发布时间】:2013-02-08 21:44:10
【问题描述】:

我试图将 512 个字节写为无符号字符,但将它们作为结构中的字段读取。下面是我想出的工会。

typedef union {
    unsigned char buffer[512]; //512 bytes
    struct {
            unsigned char a[446];
            struct part b[4]; //sizeof(part) = 16
            unsigned char c[2];
    }parsed; //446 + 4*16 + 2 = 512 bytes
}tbl;

我可以正确地写入缓冲区,但从 a 或 b 或 c 读取会给出 0。 - 我正在使用 gcc - 在 64 位 Linux 机器上 - 有/没有 -m32 标志没有区别。

有人可以阐明我所缺少的吗?

【问题讨论】:

  • 填写union 字段并使用另一个字段是未定义的行为。

标签: c unions reinterpret-cast mbr type-punning


【解决方案1】:

哎呀,对不起。它工作得很好。显然, b[1] 都是零。我将它与 b[0] 字段进行比较。道歉。

【讨论】:

  • 请在@AndreasGrapentin 的回答中考虑有关填充的信息。这是因为您发布的代码是不可移植的(甚至不能保证在不同的编译器之间)并且可能导致严重的“隐藏”问题。
  • 是的,安德烈亚斯是对的。我忘了说我的 struct 'part' 已经打包好了。
【解决方案2】:

你真的不应该这样做。由于对齐问题,您的结构很可能大于 512 字节。或者,换句话说,编译器在结构字段之间放置空白空间。

如果您想避免这种性能损失,请查看#pragma pack 指令。也许你的编译器支持它。

编辑:另外,请说明您如何写入 buf。如果a 也为 0,则可能会出现错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-12
    • 2016-02-20
    • 2012-02-05
    • 1970-01-01
    • 2020-12-09
    • 2013-07-14
    • 1970-01-01
    相关资源
    最近更新 更多