【问题标题】:sizeof char array inside an union is not printing correctly [duplicate]联合内的 sizeof char 数组未正确打印 [重复]
【发布时间】:2017-09-10 23:20:15
【问题描述】:
union u
{
    int a;
    float b;
    char c[10];
};
int main()
{
    union u abc;
    printf("\n%d",sizeof(abc));
}

输出:12 我希望输出是 10.sizeof(char) 是 1。所以对于 10,我希望它是 10。有人可以解释一下为什么我们得到 12。

【问题讨论】:

  • 有填充。
  • 标题:'sizeof char array',(char c[10])。代码:'sizeof(abc)',(联合)。为什么要声称一件事,然后证明另一件事?
  • 你问的是数组的大小(标题)还是联合的大小(代码)?
  • 打印“联合内的sizeof char数组”,printf("%zu\n",sizeof(abc.c));

标签: c sizeof unions


【解决方案1】:

这是因为floatint 数据类型之间可能至少有一个具有 4 字节对齐要求。所以struct 得到 2 个字节的填充(所以sizeof(struct u) % 4 == 0)。

如果您的编译器支持 __attribute__((packed)) 或类似功能以避免填充,则您可以使用它们,但除非您有预先存在的数据要符合,否则这并不方便。考虑一下这样一个事实:一组打包的 struct u 元素将具有未对齐的 float/int 成员。

【讨论】:

  • “这是因为 float(和 int)有 4 字节对齐要求。” --> 可能只是两者之一有要求,尤其是 16 位 int
  • @chux:是的,在大多数非嵌入式平台上,两者大多都是 4 字节,在嵌入式平台上,这真的取决于。我不确定半精度浮点,肯定用在计算机图形学中,但不知道哪个嵌入式架构可以直接替代float
猜你喜欢
  • 2016-01-08
  • 1970-01-01
  • 2021-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 2012-10-16
  • 1970-01-01
相关资源
最近更新 更多