联合中的意外结果(C ++)

时间:2017-03-18 09:56:07

标签: c++ unions

我在高中学习,我正在制作一个程序只是为了理解工会如何运作,但该计划给了我意想不到的结果。

这是该计划:

#include <iostream>
using namespace std;

union c{
    int l;
    int b;
    int h;
    int vol;
};

int main() {
    c box;
    box.l=1;
    box.b=2;
    box.h=3;

    box.vol = box.l*box.b*box.h;

    cout<<"\n Volume :-  "<<box.vol;
    return 0;
}

输出如下:

 Volume :-  27

我想知道为什么会这样。

2 个答案:

答案 0 :(得分:3)

您遇到此问题是因为您将union视为struct

Union分配一个内存空间,该内存空间可以包含任何元素,但不包含所有元素。在您编写它的方式中,有三个名称有效地指向相同的地址。这意味着,根据分配,您最终会将3放入已分配的空间。

换句话说,您编写本文的方式,您只需创建四种引用相同数据的方法。

使用联合的方法的一个示例是描述两个或更多个替代结构。例如:

union Shape {
  struct triangle {
    int base;
    int height;
  }
  struct rectangle {
    int length;
    int width;
  }
}

您现在可以使用单一数据类型来处理这两种情况。

答案 1 :(得分:0)

union是C中可用的特殊数据类型,允许在同一内存位置存储不同的数据类型。您可以定义具有许多成员的联合,但在任何给定时间只能有一个成员包含值。联合提供了一种有效的方法,可以将相同的内存位置用于多用途。

union标签是可选的,每个成员定义都是普通的变量定义,例如int i;或漂浮f;或任何其他有效的变量定义。在union的定义结束时,在最后一个分号之前,您可以指定一个或多个union变量,但它是可选的。以下是定义名为Data的联合类型的方式,该联合类型具有三个成员i,f和str -

union Data {
   int i;
   float f;
   char str[20];
} data;  

现在,Data类型的变量可以存储整数,浮点数或字符串。这意味着单个变量,即相同的存储器位置,可用于存储多种类型的数据。您可以根据需要在联合内部使用任何内置或用户定义的数据类型。

相关问题