referencia - sizeof() c++
¿Cuál es la diferencia, pasar directamente sizeof() en la función y una variable declarada e inicializada anterior? (2)
Sí, hay una diferencia significativa.
Para el primer caso, está pasando la dirección de un
unsigned int
, básicamente uninsigned int *
.En el segundo caso, está pasando el resultado del operador
sizeof
, de tiposize_t
.
Ellos no son los mismos.
Dicho esto, según la página del manual , básicamente, ambos no son correctos. El último argumento debe ser de tipo socklen_t *
, por lo que es mejor que se adhiera a los tipos correctos.
Por ejemplo, me gustaría saber si hay alguna diferencia significativa o buena / mala práctica
Haciendo de esta manera:
unsigned int length_addr;
length_addr = sizeof(cli_addr);
nbytes = recvfrom(sockfd, buffer, sizeof(buffer), 0,
(struct sockaddr *)&cli_addr, &length_addr);
y de esta manera:
nbytes = recvfrom(sockfd, buffer, sizeof(buffer), 0,
(struct sockaddr *)&cli_addr, sizeof(cli_addr));
En realidad hay una diferencia. Como alguien dijo, hay una gran diferencia entre pasar una dirección (primera situación) o un valor (tamaño_t) (segunda situación). Si revisa la referencia manual de recv, puede ver que el último argumento es un puntero a un espacio de memoria que tiene el tamaño de sockaddr del argumento anterior.
#include <sys/socket.h>
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.*/
El primero es en realidad correcto ya que le está dando al lenght_addr el tamaño del cli_addr y luego pasa el puntero como argumento. Entonces debería funcionar bien.