Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cast struct to array?

I'm currently learning C and I have trouble understanding the following code:

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);

}

The line I don't understand is ptr = (struct dns_header *) &buffer;

Can anyone explain this in detail?

like image 794
user4793972 Avatar asked Apr 15 '15 21:04

user4793972


2 Answers

Your buffer is simply a contiguous array of raw bytes. They have no semantic from the buffer point of view: you cannot do something like buffer->ra = 1.

However, from a struct dns_header * point of view those bytes would become meaningful. What you are doing with ptr = (struct dns_header *) &buffer; is mapping your pointer to your data.

ptr will now points on the beginning of your array of data. It means that when you write a value (ptr->ra = 0), you are actually modifying byte 0 from buffer.

You are casting the view of a struct dns_header pointer of your buffer array.

like image 120
Xaqq Avatar answered Oct 30 '22 02:10

Xaqq


The buffer is just serving as an area of memory -- that it's an array of characters is unimportant to this code; it could be an array of any other type, as long as it were the correct size.

The struct defines how you're using that memory -- as a bitfield, it presents that with extreme specificity.

That said, presumably you're sending this structure out over the network -- the code that does the network IO probably expects to be passed a buffer that's in the form of a character array, because that's intrinsically the sanest option -- network IO being done in terms of sending bytes.

like image 39
Charles Duffy Avatar answered Oct 30 '22 02:10

Charles Duffy