Casting un tableau de caractères pour être de type struct *

Dans le code ci-dessous, quelqu’un pourrait-il expliquer ce qui se passe sur la ligne struct ether_header *eh = (struct ether_header *) sendbuf; ? Je comprends qu’il crée un pointeur eh de type ether_header et que sur le ether_header RHS, vous voulez que sendbuf soit un pointeur de tyoe struct ether_header . Mais comment faire si sendbuf est un char array ? Aussi pourquoi voudriez-vous faire cela?

Voici le lien vers la trame ethernet d’envoi de code complet

 #include  #include  #include  #include  #include  #include  #include  #include  #include  int main(int argc, char *argv[]) { int sockfd; struct ifreq if_idx; struct ifreq if_mac; int tx_len = 0; char sendbuf[BUF_SIZ]; struct ether_header *eh = (struct ether_header *) sendbuf; 

Mais comment pouvez-vous le faire si sendbuf est un tableau de caractères?

Le code ne devrait pas faire cela.

Transformer un pointeur sur un type qui n’était pas à l’origine un pointeur valide pour ce type correspond à un comportement indéfini (UB).

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

Au minimum, déterminez si struct ether_header avait une exigence d’alignement comme étant une adresse paire et sendbuf[] commençait par une adresse impaire. L’affectation peut tuer le programme.

Une deuxième préoccupation est ce que le code non posté pourrait faire plus tard avec sendbuf[] et eh ce qui peut constituer une violation de la règle de crénelage ssortingcte @Andrew Henle .


Une meilleure approche consiste à utiliser un union . Maintenant, les membres sont alignés et le union gère la règle de crénelage ssortingcte.

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

Aussi pourquoi voudriez-vous faire cela?

Pour permettre l’access aux données à partir de 2 outlook de type de données. Peut-être faire un dépotoir de données de u .

La ligne caractère char sendbuf[BUF_SIZ] alloue un bloc de caractères (octets sur la plupart des systèmes) et la struct ether_header *eh = (struct ether_header *) sendbuf indique que vous souhaitez explicitement traiter cela comme un type struct ether_header . Il n’y a pas d’instructions significatives dans cette dissortingbution, mis à part (éventuellement) la configuration d’un registre de CPU.

Vous vous retrouverez avec deux pointeurs sur le même bloc de mémoire. La modification de l’un affectera l’autre.

Cela étant dit, ce n’est pas tout à fait correct / sûr, car le sendbuf peut ne pas être correctement aligné pour contenir réellement une struct ether_header .

Edit: En ce qui concerne les règles de structure d’alias, un caractère char* est explicitement autorisé à aliaser tout autre type de données, mais l’inverse n’est pas nécessairement vrai.