2016-10-30 2 views
2

Zum Beispiel würde ich gerne wissen, ob es ein signifikanter Unterschied oder gute/schlechte Praxis istWas ist der Unterschied, die Funktion sizeof() und eine vorher deklarierte und initialisierte Variable direkt übergeben?

Auf diese Art und Weise:

unsigned int length_addr; 
length_addr = sizeof(cli_addr); 

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

und auf diese Weise:

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

Antwort

2

Ja, Es gibt einen signifikanten Unterschied.

  • Für den ersten Fall sind vorbei Sie die Adresse eines unsigned int, im Grunde ein insigned int *. Im zweiten Fall geben Sie das Ergebnis sizeof vom Typ size_t.

Sie sind nicht das Gleiche.

Das sagte, wie die man page, im Grunde beide nicht korrekt sind. Das letzte Argument sollte vom Typ socklen_t * sein, also sollten Sie besser bei den richtigen Typen bleiben.

+0

Wann sagst du "beide sind nicht korrekt", sind sie zu 100% falsch? Warum ist der erste nicht korrekt? Ich übergebe eine Referenz von unsigned int. Das Argument socklen_t * darf kein unsigned int sein? –

+1

@jorgesaraiva, 'socklen_t' ist einer der Typen, die stark von der Architekturgröße abhängen ... da sie als' signed int' implementiert werden können (um negative, Fehlerwerte zu berücksichtigen) als 'unsigned int' (zu berücksichtigen) große Werte) und "unsigned long int" (zum Beispiel in 64-Bit-Architekturen, eine 64-Bit-Ganzzahl), um große Werte zu ermöglichen. Sie sollten besser die richtigen Typen verwenden, da sie für Ihre Bequemlichkeit da sind. Und tatsächlich mehr, wenn Sie den Zeiger auf den Typ anstatt auf den Wert setzen müssen. Dies ist ein häufiger Fehler, der zu vielen unentdeckten Fehlern führt, die sehr schwer zu verfolgen sind. –

1

Es gibt tatsächlich einen Unterschied. Wie jemand sagte, gibt es einen großen Unterschied zwischen der Übergabe einer Adresse (erste Situation) oder eines (Größe_t) Wertes (zweite Situation). Wenn Sie die Referenz revfrom manuell überprüfen, können Sie sehen, dass das letzte Argument ein Zeiger auf einen Speicherbereich ist, der die Größe von sockaddr des vorherigen Arguments hat.

#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.*/ 

Die erste ist tatsächlich richtig, wie Sie auf die lenght_addr die Größe des cli_addr geben und dann den Zeiger als Argument übergeben. Also sollte es gut funktionieren.

Verwandte Themen