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

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...