在联合中,我们知道所使用的内存最多是其元素所占用的内存,但是在同一内存空间中如何存储联合的不同元素,它们是否不会在相同的内存空间上被覆盖而导致丢失先前的内存空间元素存在那里,我实际上想知道在存储不同元素时联合的确切工作..........
答案 0 :(得分:3)
我认为你可能对union
的内容感到困惑。
这些MSDN页面here (c)和here (C++)更详细,但基本上联合是一种机制,其中相同的内存地址可以根据具体情况以不同的方式引用:
union sign /* A definition and a declaration */
{
int svar;
unsigned uvar;
} number;
此示例定义了一个union变量 类型符号并声明一个变量 具有两个成员的命名号码: svar,有符号整数,uvar,an 无符号整数。这个宣言 启用数字的当前值 存储为有符号值或 无符号值。标签是 与此联合类型相关联的是 登录。
答案 1 :(得分:3)
你是对的。内存被覆盖,因为所有元素共享相同的空间。看看这个:
union foo{
int i;
char[4] carr;
};
假设整数是4个字节而char是1个字节,如果修改整数,则将修改char数组的所有四个元素。
我强烈建议您编写自己的小代码(使用适当的printf
)来理解联合的工作。你会以这种方式学得更快。
答案 2 :(得分:1)
是的,联盟确实会重叠成员,因此更改一个会产生改变另一个的副作用。这就是重点。
答案 3 :(得分:0)
你似乎在误解中苦苦挣扎。
分配不同类型的新值 会覆盖现有数据。
答案 4 :(得分:0)
它只不过是一种查看或解释联合结构底层内存的方法。即这4个字节是整数,还是指针,还是有助于双重等? (例如)。因此,写入int将影响指针值或双倍。
是的 - 写入一个值会覆盖以前的值 - 就像普通的结构(或其他任何东西)一样。
答案 5 :(得分:0)
他们被覆盖,即每次分配一个工会会员时,您都会更改另一个工会会员。这实际上是C中联合的意图 - 能够在内存中的相同位上具有不同的类型视图。经典示例是在运行时检查平台的endiannes(愚蠢但说明性):
union duo
{
uint16_t short_;
uint8_t bytes[2];
} the_duo;
/* will assign either bytes[0] or bytes[1]
* depending on the architecture */
the_duo.short_ = 1;
if ( the_duo.bytes[0] )
printf( "little endian\n" );
else if ( the_duo.bytes[1] )
printf( "big endian\n" );
else
printf( "where am i?\n" );