我在读一些代码
我正在阅读一个教程,位于这里tutorial说
union允许我们将数据视为单独的字段或单个字节数组。
有人可以向我解释一个联盟如何让你将数据视为单字节数组。我对联合的理解是,它们使您能够在同一个内存位置存储不同的数据类型,但在任何给定时间只有一个成员可以包含值。
union ethframe
{
struct
{
struct ethhdr header;
unsigned char data[1500];
} field;
unsigned char buffer[1514];
};
不知道你在哪里知道只有一个成员可以在任何给定时间包含一个值,但这是错误的。举个例子:
union example
{
int a;
char b[4];
};
如果为a
赋值,如果检查b
的内容,你会发现4个数组元素中的每一个都对应于int
的a
的4个字节。如果你更改其中一个,你将间接改变a
的值。
union的正常使用是一次只存储(和检索)一个值。
C在某种程度上是一种中级语言。它都支持使用具有各种功能的类型(整数,浮点,指针,数组,结构,联合,位字段,这些的组合等),但也允许访问表示类型的字节。
在C中,您可以将指向对象的指针转换为指向字符类型的指针,并使用该指针检查对象的字节。
您还可以将值存储到union的一个成员,然后使用另一个成员读取内容。执行此操作时,将重新解释union中的字节,就好像它们表示正在使用的成员类型中的值一样。
如果您不正确地执行此操作,程序可能会出现严重问题。检查或重新解释对象的字节应仅用于特殊目的。例如,针对特定硬件的专用数学库代码可能需要操纵浮点对象的字节。某些输入/输出代码可能需要将对象打包为传递给其他系统的字节流,或者可能需要接收字节流并将其重新解释为其他对象。
对于联合的正常使用,您应该只读取最后写的成员。