struct and union 的区别
2017-05-05 14:33
465 查看
程序中发现大bug:
typedef union{
MDInt_Source SourceIn;
MDInt_PackedSource PackedSourceIn;
MDInt_ChrSource ChrSourceIn;
MDInt_ForbiddenZone fzone;
MDInt_ObjParam ObjParam;
MDInt_PDParam PDParam;
MDInt_HedParam HedParam;
void *pCallbackhandle;
}MDInt_Inputs;
结果在应用层,给 MDInt_PDParam 和MDInt_HedParam 两个结构体赋值, 发现MDInt_PDParam 的参数值错误。
错误原因在于使用了 union。 将上述union修改为 typedef struct{。。。}MDInt_Inputs, 即可解决参数值错误(被覆盖)的问题
讨论下union与struct的不同:
有篇原创讲的很清楚了:http://blog.csdn.net/firefly_2002/article/details/7954458
首先看看union,在c++中,union可能没有多大用处,在c语言中,可能我们要借助其完成很多巧妙的设计,下面是其一个完整的定义:
union UTest { double dlOne; char chOne; byte bArray[4]; };
好了,看到上面的定义,很像struct的定义,但是对于union来说,有几点是值得注意的:不能直接对其进行初始化;某个时候只能使用其中的一个元素;最后一点也是最重要的一点就是内存共享,分配给union内存的Size是其中Size最大的那个元素的Size。说到这里,既然union最重要的是内存共享,那么我们做如下定义:union UTest tEle;然后赋值:tEle.dlOne = 2.0f;现在是dlOne可用,下一步:tEle.chOne = 'A';到这里dlOne失去了其意义,chOne变得可用。
然后,我们再来看看Struct,在struct中每一个元素都是分配内存的,而且都是有单独意义的,也就是说对一个变量的赋值并不影响其它变量的取值。到这里,各位应该明白这两者之间的区别了吧,事实上我个人认为,它们最主要的区别是在内存的分配和使用上。知道这一点,一切也就不难理解了。
最后,在使用union的时候,可能有时候我们会来用其来对字节流进行分解和重组,这样使用的时候一定要注意各种内存对数据的存储,比如Intel是按高高低低的原则存储的,有些则是相反的。因此,这点因该值得注意,否则得到的可能和预期的结果不一样。
举例:使用union结构输出主机字节序
int main ( void ) { union { short s; char c[sizeof(shor)]; }un; un.s = 0x0102; printf ( "%s:", CPU_VENDOR_OS ); if ( 2==sizeof(short) ) { if ( 1==un.c[0] && 2==un.c[1]) { printf ( "big-endian/n" ); } else if ( 2==un.c[0] && 1==un.c[1] ) { printf ( "little-endian/n"
); } else { printf ( "unknown/n" ); } } else { printf ( "sizeof(short) = %d/n", sizeof(short) ); } return 0; }
typedef union{
MDInt_Source SourceIn;
MDInt_PackedSource PackedSourceIn;
MDInt_ChrSource ChrSourceIn;
MDInt_ForbiddenZone fzone;
MDInt_ObjParam ObjParam;
MDInt_PDParam PDParam;
MDInt_HedParam HedParam;
void *pCallbackhandle;
}MDInt_Inputs;
结果在应用层,给 MDInt_PDParam 和MDInt_HedParam 两个结构体赋值, 发现MDInt_PDParam 的参数值错误。
错误原因在于使用了 union。 将上述union修改为 typedef struct{。。。}MDInt_Inputs, 即可解决参数值错误(被覆盖)的问题
讨论下union与struct的不同:
有篇原创讲的很清楚了:http://blog.csdn.net/firefly_2002/article/details/7954458
首先看看union,在c++中,union可能没有多大用处,在c语言中,可能我们要借助其完成很多巧妙的设计,下面是其一个完整的定义:
union UTest { double dlOne; char chOne; byte bArray[4]; };
好了,看到上面的定义,很像struct的定义,但是对于union来说,有几点是值得注意的:不能直接对其进行初始化;某个时候只能使用其中的一个元素;最后一点也是最重要的一点就是内存共享,分配给union内存的Size是其中Size最大的那个元素的Size。说到这里,既然union最重要的是内存共享,那么我们做如下定义:union UTest tEle;然后赋值:tEle.dlOne = 2.0f;现在是dlOne可用,下一步:tEle.chOne = 'A';到这里dlOne失去了其意义,chOne变得可用。
然后,我们再来看看Struct,在struct中每一个元素都是分配内存的,而且都是有单独意义的,也就是说对一个变量的赋值并不影响其它变量的取值。到这里,各位应该明白这两者之间的区别了吧,事实上我个人认为,它们最主要的区别是在内存的分配和使用上。知道这一点,一切也就不难理解了。
最后,在使用union的时候,可能有时候我们会来用其来对字节流进行分解和重组,这样使用的时候一定要注意各种内存对数据的存储,比如Intel是按高高低低的原则存储的,有些则是相反的。因此,这点因该值得注意,否则得到的可能和预期的结果不一样。
举例:使用union结构输出主机字节序
int main ( void ) { union { short s; char c[sizeof(shor)]; }un; un.s = 0x0102; printf ( "%s:", CPU_VENDOR_OS ); if ( 2==sizeof(short) ) { if ( 1==un.c[0] && 2==un.c[1]) { printf ( "big-endian/n" ); } else if ( 2==un.c[0] && 1==un.c[1] ) { printf ( "little-endian/n"
); } else { printf ( "unknown/n" ); } } else { printf ( "sizeof(short) = %d/n", sizeof(short) ); } return 0; }
相关文章推荐
- union和struct的区别
- struct and union
- 联合体(union)和结构体(struct)的区别
- C++中的共用体(union)结构解析与结构体(struct)共用体(union) 的区别
- C中的union和struct的区别
- class struct union 的区别
- union和struct区别
- (转载)C中的union和struct的区别,为什么要发明union?
- 大端小端区别、Union和Struct的内存分配
- Struct 和 Union区别
- 关于 Union,Struct and Class的大小计算问题的思考(转)&union和struct类型的大小计算(转)
- union, struct, enum 的 大小区别
- union和struct的区别
- 从struct和union的区别中隐身对 大小端存储格式的理解
- 神秘的sizeof(union和struct的区别)
- union 与 struct 区别
- struct 与 union 的区别
- C中的union和struct的区别,为什么要发明union?
- 关于Union,Struct and Class的大小计算问题
- strlen与sizeof区别(转载)以及struct,union的sizeof内存对齐等问题