【问题标题】:Explain the result of sizeof operator for a union containing structures解释包含结构的联合的 sizeof 运算符的结果
【发布时间】:2012-07-25 12:59:56
【问题描述】:
#include<stdio.h>
struct mystruct
{
    char cc;
    float abc;
};
union sample
{
    int a;
    float b;
    char c;
    double d;
    struct mystruct s1;
};
int main()
{
    union sample u1;
    int k;
    u1.s1.abc=5.5;
    u1.s1.cc='a';

    printf("\n%c %f\n",u1.s1.cc,u1.s1.abc);
    k=sizeof(union sample);
    printf("%d\n\n",k);
    return 0;
}

运算符的大小正在返回8 我仍然能够访问结构元素,一次不止一个,而且sizeof 运算符仍然返回我假设的原始数据类型的最大大小。为什么会出现这种行为?实际分配的大小是8吗? sizeof 返回错误的值?还是实际分配的大小是8?那么结构是如何容纳的?如果我们使用mallocsizeof 分配一个联合数组,它会在这种情况下分配足够的空间吗?请详细说明。

【问题讨论】:

  • sizeof(double) == 8 不要忘记结构对齐/填充。
  • 结构需要9的大小对吗??
  • @sasidhar,对您的程序进行一项修改:ideone.com/2HhTn
  • @sasidhar:9? 9是从哪里来的? sizeof(float) 是 4。sizeof(char) 是 1。因此,您的结构至少需要 5 个字节。但出于对齐目的,它占用 8 个。为什么是 9 个?
  • @sasidhar:sizeof(float) 得到什么?

标签: c sizeof structure unions


【解决方案1】:

通常,联合的大小是其最大成员的大小。最大的成员 [可能] 您的结构成员以及 double 成员。两者的大小都是 8。所以,正如 sizeof 正确告诉你的那样,联合的大小确实是 8。

你为什么觉得奇怪?为什么称 8 为“错误值”?

【讨论】:

  • 它如何容纳structure 内的成员??
  • @sasidhar:你的“如何”是什么意思?您的结构成员的大小可能是 8(检查它)。 union 的大小是 8。所以,union 确实足够大,可以容纳 struct 成员。您认为问题在哪里?
【解决方案2】:
struct mystruct
{
    char cc;   //1 -byte 
    //3 bytes Added here for Padding
    float abc; //size of float is 4-bytes
};

所以 1 + 3 + 4 = 8 个字节。

我们知道内存将分配给最大的联合成员。在我们的例子中,sizeof(double) = sizeof(struct mystruct) 都是 8。

【讨论】:

    【解决方案3】:

    联合用于将多个成员放置在同一内存位置 - 您一次不能使用多个成员。它们都是重叠的,所以联合体的大小与最大成员的大小相同。

    【讨论】:

      【解决方案4】:

      联合类型是允许使用不同类型描述访问相同内存的特殊结构。例如,可以描述一个数据类型的联合,它允许读取与整数、浮点数或用户声明类型相同的数据

      union 
      {
          int i;
          float f;
          struct 
          {
           unsigned int u;
           double d;
          } s;
      } u;
      

      在上面的例子中,u 的总大小是 u.s 的大小(它是 u.s.u 和 u.s.d 的大小之和),因为 s 比 i 和 f 都大。在给 u.i 赋值时,如果 u.i 小于 u.f,则 u.f 的某些部分可能会被保留。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-05-30
        • 1970-01-01
        • 1970-01-01
        • 2017-06-21
        • 1970-01-01
        • 1970-01-01
        • 2019-06-20
        相关资源
        最近更新 更多