将struct转换为数组?

use*_*972 6 c arrays struct pointers

我目前正在学习C,我无法理解以下代码:

struct dns_header
{
    unsigned char ra : 1;
    unsigned char z : 1;
    unsigned char ad : 1;
    unsigned char cd : 1;
    unsigned char rcode : 4;
    unsigned short q_count : 16;

};

int main(void)
{
    struct dns_header *ptr;
    unsigned char buffer[256];

    ptr = (struct dns_header *) &buffer;

    ptr->ra = 0;
    ptr->z = 0;
    ptr->ad = 0;
    ptr->cd = 0;
    ptr->rcode = 0;
    ptr->q_count = htons(1);

}
Run Code Online (Sandbox Code Playgroud)

我不明白的是 ptr = (struct dns_header *) &buffer;

任何人都可以详细解释这个吗?

Xaq*_*aqq 4

您的buffer只是一个连续的原始字节数组。从角度来看,它们没有语义buffer:你不能做类似的事情buffer->ra = 1

然而,从某个struct dns_header *角度来看,这些字节将变得有意义。您正在做的ptr = (struct dns_header *) &buffer;是将指针映射到数据。

ptr现在将指向数据数组的开头。这意味着当您写入值 ( ptr->ra = 0) 时,您实际上是在修改 中的字节 0 buffer

struct dns_header您正在转换数组指针的视图buffer

  • @user4793972,回复:“更好”,这取决于细节。在这里,我们确切地知道在编译时需要多少空间——如果您需要分配动态确定的空间量,这是根本不可能的,并且如果我们需要任何代码能够在函数退出后引用缓冲区(事实上,任何指向该缓冲区的指针都将变得无效......或者更确切地说,一旦函数退出,访问它们的行为将变得未定义)。 (2认同)