Quelle est la différence, en passant directement sizeof () sur la fonction et une variable déclarée et initialisée précédente?

Par exemple, je voudrais savoir s’il y a une différence significative ou une bonne / mauvaise pratique

Faire ceci:

unsigned int length_addr; length_addr = sizeof(cli_addr); nbytes = recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr *)&cli_addr, &length_addr); 

et de cette façon:

 nbytes = recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr *)&cli_addr, sizeof(cli_addr)); 

Oui, il y a une différence significative.

  • Pour le premier cas, vous passez l’adresse d’un unsigned int , essentiellement un insigned int * .

  • Dans le second cas, vous passez le résultat de la sizeof opérateur, de type size_t .

Ils ne sont pas les mêmes.

Cela dit, selon la page de manuel , les deux ne sont pas corrects. Le dernier argument devrait être du type socklen_t * , vous devriez donc vous en tenir aux types corrects.

Il y a en fait une différence. Comme quelqu’un l’a dit, il y a une grande différence entre passer une adresse (première situation) ou une (taille_t) valeur (deuxième situation). Si vous vérifiez la référence manuelle recvfrom, vous pouvez voir que le dernier argument est un pointeur sur un espace mémoire de la taille de sockaddr de l’argument précédent.

 #include  ssize_t recvfrom(int socket, void *buffer, size_t length, int flags, struct sockaddr *address, socklen_t *address_len); /*address_len Specifies the length of the sockaddr structure pointed to by the address argument.*/ 

Le premier est correct car vous donnez à lenght_addr la taille de cli_addr, puis le passage du pointeur comme argument. Donc ça devrait bien marcher.