这个问题背后的想法是了解使用联合的更深层次的概念,并以不同的方式使用它,以节省记忆.我的问题是 –
假设有一个结构
struct strt { float f; char c; int a; }
并以相同的结构代表团结
union unin { float f; char c; int a; }
如果我将值分配给结构成员,然后打印出来,就可以得到
打印.但是,在联盟的情况下,并不会发生这种情况.
所以我需要找出一种方法,它可以使用union来存储f,c,a的值,然后我可以打印相同的方法. (应用任何操作或任何东西..)但我正在寻找这种技术.任何人在那里可以指导我或给我任何想法?
解决方法
如果你要看一个结构如何存储它的值,那就是这样的:
|0---1---2---3---|4---|5---6---7---8---| |ffffffffffffffff| | | <- f: Where your float is stored | |cccc| | <- c: Where your char is stored | | |aaaaaaaaaaaaaaaa| <- a: Where your int is stored
所以当你改变f的值时,你实际上是改变0-3的字节.当您更改char时,您实际上正在更改字节4.当您更改int时,您实际上正在更改字节5-8.
如果你现在看一个工会如何存储它的价值观,那就是这样的:
|0---1---2---3---| |ffffffffffffffff| <- f: where your float is stored |cccc------------| <- c: where your char is stored |aaaaaaaaaaaaaaaa| <- a: where your int is stored
所以现在,当我改变f的值时,我正在改变字节0-3.由于c存储在字节0中,当你改变f时,你也可以改变c和a!当您更改c时,您正在更改f和a的一部分 – 当您更改a时,您正在更改c和f.这就是你的“覆盖”发生的地方.当您将3个值打包到一个内存地址中时,您根本不会“节省空间”您只是创建3种不同的方式来查看和更改相同的数据.你并没有一个int,一个float和一个char,在物理层面上,你只有32位,可以被视为一个int,一个float或一个char.改变一个是为了改变别人.如果你不希望它们彼此改变,那么使用一个结构体.
这就是为什么gcc告诉你,你的结构体是9个字节长,而你的工会只有4个 – 它不是节省空间 – 只是结构和工会是不一样的.