HOWTO · C

Verwendung der Funktion strdup in C

Erfahren Sie, wie strdup einen String in C dupliziert, wie Sie die zugewiesene Kopie überprüfen und freigeben und wann Sie strndup oder das GNU-spezifische strdupa verwenden.

Auf dieser Seite

strdup erstellt eine nullterminierte Kopie eines C-Strings und gibt dafür separat reservierten Speicher zurück. Prüfen Sie den zurückgegebenen Zeiger, bevor Sie ihn verwenden, und geben Sie eine erfolgreiche Kopie anschließend mit free frei. Wenn Sie die Anzahl der kopierten Bytes begrenzen müssen, verwenden Sie strndup; strdupa ist eine GNU-spezifische Alternative mit einer anderen Lebensdauer.

Was strdup macht und wo die Funktion verfügbar ist

Die Deklaration von strdup lautet char *strdup(const char *s); und steht in <string.h>. Die Funktion kopiert die Bytes des nullterminierten Strings s einschließlich des abschließenden Nullbytes in neu reservierten Speicher. Der zurückgegebene Zeiger verweist auf diesen Speicher. Schlägt die Speicherreservierung fehl, gibt die Funktion NULL zurück.

strdup gehört nicht zur C-Standardbibliothek. Die Funktion ist in POSIX spezifiziert und wird von gängigen C-Bibliotheken wie der GNU-C-Bibliothek bereitgestellt. Bei einem strikten Sprachmodus kann eine Plattform ein Feature-Test-Makro voraussetzen, damit die Deklaration sichtbar ist. Wenn Sie auch Systeme außerhalb von POSIX unterstützen müssen, prüfen Sie die Dokumentation der jeweiligen Plattform.

Einen String mit strdup duplizieren

Definieren Sie _POSIX_C_SOURCE vor den Header-Includes, wenn die Plattform dieses Makro benötigt, um die POSIX-Deklaration bereitzustellen. Das Beispiel prüft das Ergebnis, bevor es gelesen wird, und gibt die Kopie nach der Verwendung frei. Bei erfolgreicher Ausführung gibt es den Quellstring und seine Kopie aus. Die unveränderten Beispielausgaben können englische Beschriftungen enthalten; diese bleiben im byte-identischen Beispiel auf Englisch.

Führen Sie dieses Beispiel aus:

#define _POSIX_C_SOURCE 200809L
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void) {
    const char *source = "C strings";
    char *copy = strdup(source);

    if (copy == NULL) {
        puts("Could not duplicate the string.");
        return EXIT_FAILURE;
    }

    printf("Source: %s\nCopy: %s\n", source, copy);
    free(copy);
    return 0;
}
Source: C strings
Copy: C strings

Wenn strdup NULL zurückgibt, dürfen Sie den Zeiger weder an String-Funktionen übergeben noch mit free freigeben. Der Fehlerzweig oben meldet das Problem und beendet das Programm ordnungsgemäß. Sobald die Kopie nicht mehr benötigt wird, rufen Sie free genau einmal auf. Das Stringliteral als Quelle freizugeben oder die Kopie nach ihrer Freigabe weiterzuverwenden, ist ungültig.

Höchstens n Bytes mit strndup kopieren

strndup ist ebenfalls in POSIX spezifiziert und in <string.h> deklariert. Die Deklaration lautet char *strndup(const char *s, size_t n);. Die Funktion kopiert höchstens n Bytes aus s und fügt dem reservierten Ergebnis immer ein abschließendes Nullbyte hinzu. Die Grenze zählt Bytes, keine Zeichen. Liegt sie mitten in der Kodierung eines mehrbyteigen Zeichens, kann dieses daher unvollständig kopiert werden.

Zum Beispiel ergibt strndup("C strings", 3) den String "C s". Der zurückgegebene Speicher wird dynamisch reserviert. Prüfen Sie deshalb wie bei strdup auf NULL und geben Sie ein erfolgreiches Ergebnis mit free frei. Die Grenze beschränkt die kopierte Datenmenge, nicht die Lebensdauer oder den Besitz des Ergebnisses.

Die GNU-spezifische Alternative strdupa verstehen

strdupa ist eine Erweiterung der GNU-C-Bibliothek und weder eine POSIX-Funktion noch eine Funktion des C-Standards. Definieren Sie bei Bedarf _GNU_SOURCE vor den System-Headern, damit ihre Deklaration verfügbar ist. Wie strdup nimmt die Funktion einen nullterminierten String entgegen und erstellt eine Kopie. Dafür verwendet sie jedoch automatischen Speicher, der an die aktuelle Funktion gebunden ist, statt Speicher auf dem Heap zurückzugeben.

Dieser Speicher bleibt nur so lange verfügbar, wie die Funktion aktiv ist, in der er angelegt wurde. Geben Sie den Zeiger daher nicht zurück, um ihn nach dem Ende dieser Funktion weiterzuverwenden, und übergeben Sie ihn nicht an free. Verfügbarkeit und Umsetzung hängen von der GNU-Umgebung ab. Verwenden Sie strdup, wenn Sie eine POSIX-Schnittstelle benötigen oder die Lebensdauer der Kopie mit free selbst steuern möchten. strdupa wird hier nicht als ausführbares Beispiel gezeigt, da die Funktion GNU-spezifisch ist.