有什么好的例子可以说明结构体和联合体的区别吗? 基本上我知道struct使用了它成员的所有内存,而union使用了最大的成员内存空间。还有其他操作系统级别的差异吗?


当前回答

简单的回答是:结构体是一个记录结构体:结构体中的每个元素分配新的空间。一个结构体

struct foobarbazquux_t {
    int foo;
    long bar;
    double baz; 
    long double quux;
}

为每个实例在内存中分配至少(sizeof(int)+sizeof(long)+sizeof(double)+sizeof(long double))字节。(“至少”是因为架构对齐约束可能迫使编译器填充结构。)

另一方面,

union foobarbazquux_u {
    int foo;
    long bar;
    double baz; 
    long double quux;
}

分配一个内存块并给它四个别名。因此sizeof(union foobarbazquux_u)≥max((sizeof(int),sizeof(long),sizeof(double),sizeof(long double)),同样有可能添加一些对齐。

其他回答

当我们需要对具有一组独立属性的事物进行建模时,建议使用结构;当一个实体具有多种形式且一次只能以一种形式存在时,建议使用联合。

让我们看看它们可以应用的两个地方

您需要存储和更新汽车的值。为了做到这一点,我们需要记录汽车的所有属性,如型号、里程、价格和燃料类型。这些值总是存在于一辆车中,它们不依赖于其他值。 因此,我们需要一种数据类型,它不仅存储所有属性,而且还确保它们的正确更新。这种类型的任务可以使用结构来完成。

struct car{
    char model[];
    int mileage;
    int price;
    char fuel_type[];
};

组织需要从大量客户那里收集您的数据以进行付款验证。现在,为了数据完整性和客户安全,一个组织被指示从一个人那里获得最少的详细信息。 这些详细信息可以是您的PAN号码或帐户号码或选民身份证。现在,因为我们需要收集这些细节中的任何一个,同时也要节省内存,我们可以在这里使用联合。它将只保存提供给它的单个值。

union verification_details{
    char account_number[10];
    char PAN[10];
    char voter_id[10];
};

我发现下面的文章解释得很好:结构和联合的区别

简单的回答是:结构体是一个记录结构体:结构体中的每个元素分配新的空间。一个结构体

struct foobarbazquux_t {
    int foo;
    long bar;
    double baz; 
    long double quux;
}

为每个实例在内存中分配至少(sizeof(int)+sizeof(long)+sizeof(double)+sizeof(long double))字节。(“至少”是因为架构对齐约束可能迫使编译器填充结构。)

另一方面,

union foobarbazquux_u {
    int foo;
    long bar;
    double baz; 
    long double quux;
}

分配一个内存块并给它四个别名。因此sizeof(union foobarbazquux_u)≥max((sizeof(int),sizeof(long),sizeof(double),sizeof(long double)),同样有可能添加一些对齐。

结构和联合的区别是什么?

简单的回答是:区别在于内存分配。 解释: 在结构中,将为结构内部的所有成员创建内存空间。 在联合内存空间将只为需要最大内存空间的成员创建。 考虑下面的代码:

struct s_tag
{
   int a; 
   long int b;
} x;

union u_tag
{
   int a; 
   long int b;
} y;

这里在struct和union内部有两个成员:int和long int。在32位操作系统中,int的内存空间为:4字节,long int的内存空间为:8。

因此,对于struct, 4+8=12个字节将被创建,而对于union,将创建8个字节

代码示例:

#include<stdio.h>
struct s_tag
{
  int a;
  long int b;
} x;
union u_tag
{
     int a;
     long int b;
} y;
int main()
{
    printf("Memory allocation for structure = %d", sizeof(x));
    printf("\nMemory allocation for union = %d", sizeof(y));
    return 0;
}

裁判:http://www.codingpractise.com/home/c-programming/structure-and-union/

你拥有它,仅此而已。 那么,工会的意义是什么呢?

您可以在相同的位置中放入不同类型的内容。你必须知道你在联合中存储的东西的类型(所以你经常把它放在一个带有type标签的结构体中…)

为什么这很重要?并不是为了获得空间。是的,你可以获得一些位或做一些填充,但这已经不是重点了。

这是为了类型安全,它允许你做某种“动态类型”:编译器知道你的内容可能有不同的含义,你如何解释它的确切含义取决于你在运行时。如果你有一个指针可以指向不同的类型,你必须使用联合,否则你的代码可能会因为别名问题而不正确(编译器会对自己说“哦,只有这个指针可以指向这种类型,所以我可以优化这些访问……”,糟糕的事情可能会发生)。

是的,struct和union之间的主要区别和你说的一样。 Struct使用其成员的所有内存,union使用最大的成员内存空间。

但所有的区别在于使用内存的需要。 在unix的进程中可以看到联合的最佳使用,在那里我们使用信号。 比如一个进程一次只能作用于一个信号。 所以一般声明是:

union SIGSELECT
{
  SIGNAL_1 signal1;
  SIGNAL_2 signal2;
  .....
};

在这种情况下,进程只使用所有信号中最高的内存。 但如果在这种情况下使用struct,内存使用量将是所有信号的总和。 有很大的不同。

总之,如果您知道一次访问任何一个成员,则应该选择Union。