【问题标题】:Size of union in C [duplicate]C中联合的大小[重复]
【发布时间】:2016-05-13 22:41:55
【问题描述】:

code

#include <stdio.h>

union Data_u
{
    long x;
    char ch[20];
};

main()
{
    union Data_u data;
    printf("%ld\n", sizeof(data));
}

我应该知道这段代码会输出什么,但我想我不明白如何正确计算联合的大小。我做了x(4 byte) + 20 = 24 的大小。但这是不正确的。谁能告诉我哪里出错了?

【问题讨论】:

  • 请将您的代码作为文本发布在问题中。
  • 欢迎来到 Stack Overflow。请尽快阅读About 页面。当您发布代码时,请将其包含在问题中(而不是,或者以及,非现场链接)。请查看结构填充和对齐;您的问题的要点不太可能在 SO 上没有得到多次回答。
  • (a) 你得到了什么结果? (b) 您是在 32 位还是 64 位系统上工作?在 32 位系统上,您可能会得到 20 的结果;在 64 位系统上,您可能会得到 24 的结果,但不是因为您给出的原因。
  • 这不是一个结构,它是一个联合。你的问题应该说明你得到的实际结果。
  • 我得到了 24 的结果。正确的是 20。我会看看那个问题,抱歉重复。

标签: c


【解决方案1】:

如果您将代码更改为:

union Data_u
{
    long x;
    char ch[20];
} __attribute__((packed));

sizeof() 会给你 20 个。

但你不应该这样做。让编译器按照它认为最优的方式组织它。

【讨论】:

    【解决方案2】:

    结构在内存中按顺序排列其成员,访问其所有成员是有意义的。如果你有:

    struct Data_u
    {
        long x;
        char ch[20];
    };
    

    那么您应该能够独立且正确地访问xch。通常,结构的大小是其字段总和的大小(加上填充),看起来就像您尝试计算的那样。

    但是,这是一个联合,而不是一个结构。联合只是代表它们的一个领域,您可以以某种方式决定使用哪个领域。其他成员应视为无效。因为一次只有一个成员是有效的,所以将它们按顺序排列在内存中会很浪费,所以在大多数情况下,联合的每个成员都在内存中联合的开头对齐。这意味着一般来说,联合的大小是其最大成员的大小(加上填充)。

    在您的情况下,最大的成员是 char 数组,与位数无关。在 32 位程序中,大小很可能是 20 字节,因为这就是数组的大小。在 64 位程序中,由于填充,可能会增加到 24 个字节。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 2018-05-12
      • 2010-12-22
      • 2011-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多