strcpy gegen strdup

Lesezeit: 4 Minuten

Ich habe das gelesen strcpy dient zum Kopieren einer Zeichenfolge, und strdup gibt einen Zeiger auf eine neue Zeichenfolge zurück, um die Zeichenfolge zu duplizieren.

Könnten Sie bitte erklären, welche Fälle Sie bevorzugen strcpy und welche Fälle bevorzugen Sie zu verwenden strdup?

Benutzeravatar von Abdul Muheedh
Abdul Muheedh

strcpy(ptr2, ptr1) ist äquivalent zu while(*ptr2++ = *ptr1++)

wobei as strdup äquivalent zu ist

ptr2 = malloc(strlen(ptr1)+1);
strcpy(ptr2,ptr1);

(memcpy-Version könnte effizienter sein)

Wenn Sie also möchten, dass die kopierte Zeichenfolge in einer anderen Funktion verwendet wird (wie sie im Heap-Bereich erstellt wird), können Sie strdup verwenden, andernfalls reicht strcpy aus.

  • Gute Antwort abgesehen vom letzten Satz, der verwirrend ist. Ich schätze, du meinst die Lebensdauer der strdup()ed-String kann sich über das Ende der aktuellen Funktion hinaus erstrecken, aber das könnte trotzdem der Fall sein (wenn das Ziel von strcpy() ist ein vom Aufrufer bereitgestellter Puffer, eine globale Variable oder selbst manuell zugewiesen mit malloc() oder new).

    – j_random_hacker

    24. Dezember 2012 um 12:05 Uhr

  • Ja, es ist wahr, dass, wenn der vom Aufrufer bereitgestellte Puffer eine globale Variable oder ein dynamischer Zeiger an sich ist, keine Notwendigkeit besteht, strdup zu verwenden. Ich habe gerade auf eines der Anwendungsfall-Szenarien hingewiesen und danke für die Fertigstellung.

    – Abdul Muheedh

    24. Dezember 2012 um 12:42 Uhr


  • Liebe die wirklich while(*ptr2++ = *ptr1++)! 🙂

    – Alois

    11. Juni 2013 um 21:56 Uhr


  • Wie funktioniert die Exit-Bedingung in der While-Schleife?

    – sbhatla

    5. Dezember 2016 um 0:33 Uhr

  • @sbhatla In C werden Strings mit einem Nulbyte beendet, das als falsch ausgewertet wird, und ein Zuweisungsausdruck wird mit dem zugewiesenen Wert ausgewertet.

    Benutzer1115652

    7. Februar 2017 um 16:49 Uhr


Die Funktionen strcpy und strncpy sind Teil der C-Standardbibliothek und arbeiten mit vorhandenem Speicher. Das ist, Sie muss den Speicher bereitstellen, in den die Funktionen die Zeichenfolgendaten kopieren, und als Folge davon Sie Sie müssen Ihre eigenen Mittel haben, um herauszufinden, wie viel Speicher Sie benötigen.

Im Gegensatz dazu strdup ist eine Posix-Funktion und führt die dynamische Speicherzuweisung für Sie durch. Es gibt einen Zeiger auf den neu zugewiesenen Speicher zurück, in den es die Zeichenfolge kopiert hat. Aber Sie sind nun für diesen Speicher verantwortlich und müssen schließlich free es.

Das macht strdup einer der „versteckten malloc” Komfortfunktionen, und das ist vermutlich auch der Grund, warum es nicht Teil der Standardbibliothek ist. Solange Sie die Standardbibliothek verwenden, wissen Sie, dass Sie eine aufrufen müssen free für jeden malloc/calloc. Aber Funktionen wie z strdup ein Versteck einführen mallocund Sie müssen es genauso behandeln wie a malloc zum Zweck der Speicherverwaltung. (Eine weitere versteckte Zuordnungsfunktion ist die von GCC abi::__cxa_demangle().) In acht nehmen!

  • Ahh, ich habe mich immer gefragt, warum das nicht in stdlib war, und jetzt weiß ich es.

    – Maury Markowitz

    11. März 2018 um 17:51 Uhr

strdup weist während der Verwendung Speicher für die neue Zeichenfolge auf dem Heap zu strcpy (Oder es ist sicherer strncpy Variante) kann ich eine Zeichenfolge in einen vorab zugewiesenen Speicher kopieren entweder der Haufen oder der Stapel.

  • Warum das betonte „entweder“? Ist es nicht möglich zu verwenden strcpy in einen statischen Puffer kopieren?

    – Kerrek SB

    24. Dezember 2012 um 12:30 Uhr

  • Ich habe versucht, den Unterschied in der Verwendung zwischen den beiden Funktionen hervorzuheben, ohne die Antwort mit zu vielen Problemen mit der Speicherverwaltung zu überladen. aber ja, Sie haben Recht mit statischen Puffern.

    – Ören

    24. Dezember 2012 um 12:42 Uhr

  • Wenn Sie keine Unordnung wollen, können Sie die Antwort einfach nach “vorab zugewiesener Speicher” beenden 🙂

    – Kerrek SB

    24. Dezember 2012 um 12:51 Uhr

  • Kleiner Nitpick: strncpy ist nicht sicherer als strcpy, da es nicht garantiert, dass dest nullterminiert wird. Schlimmer noch, jeder ungenutzte Platz im Zielpuffer wird mit Null-Terminatoren gefüllt. Diese Funktion war nie für den allgemeinen Gebrauch gedacht. Wenn Sie eine dieser Funktionen verwenden müssen, ist es am besten, strcpy zu verwenden und dest manuell zu beenden.

    – JohannesF

    18. November 2013 um 9:27 Uhr


Benutzeravatar von Heikki Salokanto
Heikki Salokanto

In der akzeptierten Antwort wird die Implementierung von strdup wird dargestellt als:

ptr2 = malloc(strlen(ptr1)+1);
strcpy(ptr2,ptr1);

Das ist allerdings etwas suboptimal, weil beides strlen und strcpy müssen Sie die Länge der Zeichenfolge finden, indem Sie prüfen, ob jedes Zeichen ein ist \0.

Verwenden memcpy sollte effizienter sein:

char *strdup(const char *src) {
    size_t len = strlen(src) + 1;
    char *s = malloc(len);
    if (s == NULL)
        return NULL;
    return (char *)memcpy(s, src, len);
}

Benutzeravatar von Bharath Ravindra
Bharat Ravindra

char *strdup(char *pszSrch);

strdup weist dem Speicher die Größe der ursprünglichen Zeichenfolge zu. Wenn die Speicherzuweisung erfolgreich ist, wird die ursprüngliche Zeichenfolge in die duplizierte Zeichenfolge kopiert.

strdupd zurück NULL auf Versagen. Wenn kein Speicher zugewiesen wird, schlägt das Kopieren fehl strdup Rückkehr NULL.

1418780cookie-checkstrcpy gegen strdup

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy