2014-07-10 9 views
7

Gibt es eine definitive Anleitung, die besagt, dass wir die sockaddr_in-Struktur aus einem bestimmten Grund auf Null initialisieren müssen?Warum memset sockaddr_in auf 0

// IPv4 AF_INET sockets: 
struct sockaddr_in { 
    short   sin_family; // e.g. AF_INET, AF_INET6 
    unsigned short sin_port;  // e.g. htons(3490) 
    struct in_addr sin_addr;  // see struct in_addr, below 
    char    sin_zero[8]; // zero this if you want to 
}; 

Jedes Mal, wenn ich in echtem Code oder Beispiel oder Büchern sah es hat immer die Codestruktur ähnlich die folgenden:

struct sockaddr_in foo; 
memset(&foo, 0, sizeof(foo)); 
foo.sin_port = htons(1025); 
foo.sin_family = AF_INET; 
inet_pton(AF_INET, "10.0.0.1", &foo.sin_addr); 

Ich verstehe, dass einige Quellen sagen, dass das char sin_zero[8] Mitglied dort für Polsterung und sollte auf Null gesetzt werden, aber warum den Rest auf Null setzen. Vor allem, wenn sie in den meisten Fällen innerhalb der nächsten paar Deklarationszeilen initialisiert werden. Auch über sin_zero Mitglied der Beej Programmieranleitung said it is not mandatory to zero them out anymore. Ich habe nach einer Erklärung gesucht, aber nichts auf den Punkt gekommen. Diese stack overflow question hat einige verschiedene Vorschläge zur Initialisierung selbst, erklärt aber nicht, warum die Nullsetzung notwendig ist.

Ist es eine Vermächtnisspraxis oder gibt es einen wirklichen Grund, den ich vermisse? Jede Referenz wird geschätzt.

+1

Es stellt sicher, dass Sie nicht mit Code verlassen, der auf Garbage-Werten basiert. Ein solcher Code kann Heisenbugs und andere Fehler erzeugen, die schwer zu debuggen sind. –

+1

Oder einfach 'struct sockaddr_in foo = {AF_INET, htons (1025)};' - das ist kürzer und setzt nur die restlichen Mitglieder auf Null. – MSalters

Antwort

6

Betrachten Sie es als Standardkonstruktor, d.h. es initialisiert die Daten zu bekannten Werten (in diesem Fall 0). Dies kann helfen, Probleme im Zusammenhang mit nicht initialisierten Daten bei der Verwendung von PODs zu vermeiden, wie vergessen, ein Mitglied zu setzen, obwohl memset ist nicht wirklich notwendig, und Sie können einfach initialisieren die Struktur mit sockaddr_in foo{}; (übrigens ergibt dies auch bessere Assembler-Code hinter die Szenen als der Compiler kann movq 0 alles anstatt memset anrufen, nicht, dass es in 99% der Fälle viel Unterschied machen wird).

Wenn Sie absolut sicher sind, dass Sie alle Mitglieder festlegen, ist dies nicht unbedingt notwendig, obwohl es helfen kann, Fehler früher zu erkennen, wenn Sie vergessen, etwas zu initialisieren.