微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

工会与结构在C

这个问题背后的想法是了解使用联合的更深层次的概念,并以不同的方式使用它,以节省记忆.我的问题是 –

假设有一个结构

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个 – 它不是节省空间 – 只是结构和工会是不一样的.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐