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