首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

构造和联合的区别

2012-10-16 
结构和联合的区别?结构这么定义:struct time_str{unsigned char hour,min,secunsigned int days}time_of

结构和联合的区别?
结构这么定义:
struct time_str{
  unsigned char hour,min,sec;
  unsigned int days;
}time_of_day;
结构这么定义:
union time_str{
  unsigned char hour,min,sec;
  unsigned int days;
}time_of_day;

联合和结构很相似 它由相关的变量组成 这些变量构成了联合的成员 但是这些成
员只能有一个起作用 联合的成员变量可以是任何有效类型 包括 C 语言本身拥有的类型
和用户定义的类型 如结构和联合 .

上面这段没说明它们的区别啊,结构也由相关的变量组成,也能结构中再结构。。。。
请大侠指教!

[解决办法]
union中存储时按最大的存储,struct或者class中考虑内存对齐,我起个头,楼下的接上
[解决办法]
结构中所有的成员都同时存在,结构的大小是所有成员加起来的和(包括间隙在内)
联合中某一时间只有一个成员存在,因为所有成员共用同一片区域,联合的大小是所有成员中占用内存最大的那个成员的大小
[解决办法]
union共享存储空间
也就是说

ex.
union _ex{
char c;
int i;
}ex

那么char 和 int 占据的同一块内存的。
c
0-------4Bytes
i

total 4Bytes
而struct 是按照不同的内存对齐方式,连续占据一快空间
struct _ex{
char c;
int i;
}ex

#program pack(4);
0--1---3---------7
c *** i(4 Bytes)
total 8 Bytes
[解决办法]
联合和结构很相似 它由相关的变量组成 这些变量构成了联合的成员 但是这些成
员只能有一个起作用 联合的成员变量可以是任何有效类型 包括 C 语言本身拥有的类型
和用户定义的类型 如结构和联合 

“只能有一个起作用”已经解释了两者的区别。
联合分配的内存空间是里面所有成员中占用内存最大的那个成员的大小,一旦该成员被赋值,其他的成员就不能再赋值了,因为没有空间了,如果强行给其他成员赋值的话,就会影响到后面的内存分配,把后面的变量值改变掉。而且这种内存侵占的问题还不容易发现,只会觉得有些变量的值会突然改变。
[解决办法]
内存分配上有所不同。union的总大小与成员中最大的占用的大小一致;struct的总大小是所有成员总大小的和,如果存在内存对其,那么需要使用sizeof来测试一下。
[解决办法]
1,union共享内存单元所以按占用内存最大的那个成员变量分配内存,
class、struct要考虑对齐(即将内存小的那个成员补齐到和内存单元最大的那个)
占用内存计算方式要视情况而定

C/C++ code
   union u   {      char c;      int i;   }   sizeof(u) = 4   struct s0   {      int i;      char c;   }   sizeof(s0) = 8;   struct s1   {      int i;      char c1;      char c2;   }   sizeof(s1) = 8   struct s2   {      int i;      char c1;      char c2;      char c3;      char c4;      char c5;   }   sizeof(s2) = 12   struct s3   {      double d;      char c;   }   sizeof(s3) = 16
[解决办法]
typedef struct time_str{
unsigned char hour,min,sec;
unsigned int days;
}time_of_day_str;

typedef union time_union{
unsigned char hour,min,sec;
unsigned int days;
}time_of_day_union; 

void main()

time_of_day_str my_str;
time_of_day_union my_union;

my_str.days = 11;
my_str.hour = 22;
my_str.min = 33;
my_str.sec = 44;

printf("%d\n",my_str.days);
printf("%d\n",my_str.hour);
printf("%d\n",my_str.min);
printf("%d\n",my_str.sec);

my_union.days = 11;
my_union.hour = 22;

printf("%d\n",my_union.days);
printf("%d\n",my_union.hour);
}
输出结果为:
11
22
33
44
22
22
关键看union,输出的两项居然是一样,这是因为union结构里面的项只能表示hour,min,sec,days中的其中一种
诚如my_union.days = 11就已经代表了UNION类型的赋值,如果my_union.hour = 22,只是对同样内存区域进行再次赋值,你可以从STRUCT和UNION的大小来理解,STRUCT是8个字节,UNICON是四个字节,所以STURCT可以表示包含的一堆数据类型,而UNION只能表示一个类型
[解决办法]
up

热点排行
Bad Request.