Casting a char array to be of type struct *

后端 未结 2 960
日久生厌
日久生厌 2021-01-13 13:55

In the code below could somebody perhaps explain what is happening on the line struct ether_header *eh = (struct ether_header *) sendbuf;? I understand that it

相关标签:
2条回答
  • 2021-01-13 14:30

    But how can you do this isif sendbuf is a char array?

    Code should not do this.

    Casting a pointer to a type that was not originally a valid pointer for that type is undefined behavior (UB).

    char sendbuf[BUF_SIZ];
    struct ether_header *eh = (struct ether_header *) sendbuf;  // UB
    

    At a minimum, consider if struct ether_header had an alignment requirement to be an even address and sendbuf[] began on an odd address. The assignment may kill the program.

    A 2nd concern is what unposted code might later do with sendbuf[] and eh which can violating strict aliasing rule @Andrew Henle.


    A better approach is to use a union. Now the members are aligned and the union handles the strict aliasing rule.

    union {
      char sendbuf[BUF_SIZ];
      struct ether_header eh;
    } u;
    

    Also why would you do this?

    To allow access to the data from 2 data type perspectives. Perhaps to make a data dump of u.

    0 讨论(0)
  • 2021-01-13 14:46

    The line char sendbuf[BUF_SIZ] allocates a block of chars (i.e. bytes on most systems) and the cast struct ether_header *eh = (struct ether_header *) sendbuf says that you explicitly want to treat this as a struct ether_header type. There are no significant instructions from this cast, aside from (possibly) setting a CPU register.

    You'll end up with two pointers to the same block of memory. Modification of one will affect the other.

    That being said, it is not completely correct/safe, because the sendbuf may not be appropriately aligned to actually contain a struct ether_header.

    Edit: In regard to struct aliasing rules a char* is explicitly allowed to alias any other data type, but the reverse is not necessarily true.

    0 讨论(0)
提交回复
热议问题