strcpy vs strdup

Ik heb gelezen dat strcpyis voor het kopiëren van een tekenreeks, en strdupretourneert een aanwijzer naar een nieuwe tekenreeks om de tekenreeks te dupliceren.

Kunt u uitleggen in welke gevallen u liever strcpygebruikt en in welke gevallen strdup?


Antwoord 1, autoriteit 100%

strcpy(ptr2, ptr1)is gelijk aan while(*ptr2++ = *ptr1++)

waar als strdup gelijk is aan

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

(memcpy-versieis mogelijk efficiënter)

Dus als je wilt dat de tekenreeks die je hebt gekopieerd in een andere functie wordt gebruikt (zoals deze is gemaakt in de heap-sectie), kun je strdup gebruiken, anders is strcpy voldoende.


Antwoord 2, autoriteit 54%

De functies strcpyen strncpymaken deel uit van de C-standaardbibliotheek en werken op bestaand geheugen. Dat wil zeggen, umoet het geheugen leveren waarin de functies de stringgegevens kopiëren, en als uitvloeisel daarvan, umoet uw eigen manier hebben om erachter te komen hoeveel geheugen u nodig heeft .

Daarentegen is strdupeen Posix-functie en voert deze dynamische geheugentoewijzing voor u uit. Het retourneert een aanwijzer naar nieuw toegewezen geheugen waarin het de tekenreeks heeft gekopieerd. Maar jijbent nu verantwoordelijk voor dit geheugen en moet het uiteindelijk free.

Dat maakt strdupeen van de “Verborgen malloc” Gemaksfuncties, en dat is vermoedelijk ook waarom het geen deel uitmaakt van de standaardbibliotheek. Zolang u de standaardbibliotheek gebruikt, weet u dat u een freevoor elke malloc/ callockunt bellen. Maar functies zoals strdupIntroduceer een verborgen malloc, en u moet het hetzelfde behandelen als een mallocvoor het doel van geheugenbeheer. (Nog een dergelijke verborgen toewijzingsfuncties is GCC’s abi::__cxa_demangle().) Pas op!


3, Autoriteit 14%

strdupTOEKENT geheugen voor de nieuwe tekenreeks op de heap, terwijl u strcpy(of de veiliger strncpyVARIENT) kunt gebruiken, kan ik een string kopiëren naar een vooraf toegewezen geheugen op ofwel de hoop of de stapel.


4, Autoriteit 12%

in de geaccepteerd antwoord , de implementatie van strdupwordt gepresenteerd als:

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

Dat is echter enigszins sub-optimaal omdat zowel strlenen strcpynodig hebben om de lengte van de tekenreeks te vinden door te controleren of elk teken een \0.

Gebruik memcpymoet efficiënter zijn:

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);
}

Other episodes