Wo werden Strings von Funktionen in LIBC zurückgekehrt?
-
25-10-2019 - |
Frage
Ich habe ein Socket -Programmierung gestartet und bin über die Funktion inet_ntoa gestoßen. Die Funktion hat den Prototyp char * inet_ntoa(struct in_addr in);
.
Wie/wo wird diese Zeichenfolge zugewiesen? MUSS ICH ERGEBNISSE ABSETZUNG DIE IT?
Lösung
Aus inet_ntoa(3)
:
Die Funktion inet_ntoa () konvertiert die Internet-Host-Adresse in der in Netzwerk-Byte-Reihenfolge angegebenen Reihenfolge in einer Zeichenfolge in Standardnummern und -dots. Die Zeichenfolge wird in a zurückgegeben Statisch zugewiesene Puffer, welche nachfolgenden Anrufe überschreiben werden
Also nein.
Andere Tipps
Nein, Sie befreien es nicht. Es handelt sich normalerweise um einen statischen Speicher innerhalb der Funktion oder mit Thread-spezifischen Daten, wenn Sie in einer Thread-Umgebung ausgeführt werden.
Aus Die endgültige Seite POSIX MAN:
Der Rückgabewert von
inet_ntoa()
kann auf statische Daten hinweisen, die durch nachfolgende Aufrufe zu überschrieben werden könneninet_ntoa()
.
Auf dieser Seite heißt es auch:
Die Funktion inet_ntoa () muss nicht wieder eingetragen werden. Eine Funktion, die nicht wieder eingetragen werden muss, muss nicht mit Thread-Sicherheit sein.
Das bedeutet, dass es selbst in einer Gewinde möglicherweise nicht fadensicher ist überhaupt.
Mit anderen Worten, es kann so etwas implementiert werden wie:
char *inet_ntoa (struct in_addr xyz) {
static char buff[50];
// Do something with xyz to populate buff.
return buff;
}
Sie müssen es nicht befreien, da es statisch ist.
Sie müssen jedoch eine Kopie des String -Inhalts annehmen, bevor Sie die Funktion erneut aufrufen. Andernfalls überschreiben Sie den Inhalt aus dem ersten Anruf.