c如何结合让你将数据视为一个字节数组

问题描述 投票:0回答:2

我在读一些代码

我正在阅读一个教程,位于这里tutorial

union允许我们将数据视为单独的字段或单个字节数组。

有人可以向我解释一个联盟如何让你将数据视为单字节数组。我对联合的理解是,它们使您能够在同一个内存位置存储不同的数据类型,但在任​​何给定时间只有一个成员可以包含值。

 union ethframe
  {
    struct
    {
      struct ethhdr    header;
      unsigned char    data[1500];
    } field;
    unsigned char    buffer[1514];
  };
c arrays unions
2个回答
0
投票

不知道你在哪里知道只有一个成员可以在任何给定时间包含一个值,但这是错误的。举个例子:

union example
    {
    int a;
    char b[4];
    };

如果为a赋值,如果检查b的内容,你会发现4个数组元素中的每一个都对应于inta的4个字节。如果你更改其中一个,你将间接改变a的值。


0
投票

union的正常使用是一次只存储(和检索)一个值。

C在某种程度上是一种中级语言。它都支持使用具有各种功能的类型(整数,浮点,指针,数组,结构,联合,位字段,这些的组合等),但也允许访问表示类型的字节。

在C中,您可以将指向对象的指针转换为指向字符类型的指针,并使用该指针检查对象的字节。

您还可以将值存储到union的一个成员,然后使用另一个成员读取内容。执行此操作时,将重新解释union中的字节,就好像它们表示正在使用的成员类型中的值一样。

如果您不正确地执行此操作,程序可能会出现严重问题。检查或重新解释对象的字节应仅用于特殊目的。例如,针对特定硬件的专用数学库代码可能需要操纵浮点对象的字节。某些输入/输出代码可能需要将对象打包为传递给其他系统的字节流,或者可能需要接收字节流并将其重新解释为其他对象。

对于联合的正常使用,您应该只读取最后写的成员。

© www.soinside.com 2019 - 2024. All rights reserved.