gpt4 book ai didi

c - c中的unions( union 的内存存储模式)

转载 作者:行者123 更新时间:2023-11-30 21:25:34 24 4
gpt4 key购买 nike

   #include<stdio.h>
#include<string.h>

union Data
{
float f;
char str;
};

main( )
{
union Data data;

data.f = 11111;
data.str='j';

printf( "data.f : %f\n", data.f);
printf( "data.str : %c\n", data.str);

return 0;
}

在这种情况下,我可以同时访问这两个值输出为 11111.0005,j

但是如果我反转分配,即 data.str='j';
然后 data.f = 11111;

那么str的值无法访问,为什么?

最佳答案

union 在同一内存中覆盖 float 类型和 char 类型。但 char 类型只有一个字节,而 float 则需要 4 个字节。

尽管在 32 位平台上,简单的 char 类型可能需要与简单的 float 类型一样多的内存保留,但在 union 中> 仅写入 char 字段的一个字节。

因此,当您写入它时,它只会损坏 float 类型的一个字节。这就是为什么您仍然可以 printf() char,以及为什么 float 查看它的方式已被损坏。

我已经向union添加了另一个成员,一个字节数组,这样我们就可以看到发生了什么。请注意,将 'j'(十六进制值 0x6A)写入 str 仅影响 union 的第一个字节。

#include<stdio.h>
#include<string.h>

union Data
{
float f;
char str;
unsigned char bytes[4];
};

int main(void)
{
union Data data;
int i;

data.f = 11111; // write to float
// show the union as bytes
printf("bytes:");
for (i=0; i<4; i++)
printf(" %02X", data.bytes[i]);
printf("\n");

data.str='j'; // write to char
// show the union as bytes
printf("bytes:");
for (i=0; i<4; i++)
printf(" %02X", data.bytes[i]);
printf("\n");

printf( "data.f : %f\n", data.f);
printf( "data.str : %c\n", data.str);

return 0;
}

程序输出:

bytes: 00 9C 2D 46
bytes: 6A 9C 2D 46
data.f : 11111.103516
data.str : j

如果像您的问题一样,您颠倒了分配,那么现在为什么 str='j' 不再存在是显而易见的吗?这是因为float需要union全部

关于c - c中的unions( union 的内存存储模式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28996252/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com