工会与结构在C

工会与结构在C,第1张

概述这个问题背后的想法是了解使用联合的更深层次的概念,并以不同的方式使用它,以节省记忆.我的问题是 – 假设有一个结构 struct strt{ float f; char c; int a;} 并以相同的结构代表团结 union unin{ float f; char c; int a;} 如果我将值分配给结构成员,然后打印出来,就可以得到 打印.但是,在 这个问题背后的想法是了解使用联合的更深层次的概念,并以不同的方式使用它,以节省记忆.我的问题是 –

假设有一个结构

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全部内容,希望文章能够帮你解决工会与结构在C所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/langs/1233495.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存