Ik heb gelezen dat strcpy
is voor het kopiëren van een tekenreeks, en strdup
retourneert een aanwijzer naar een nieuwe tekenreeks om de tekenreeks te dupliceren.
Kunt u uitleggen in welke gevallen u liever strcpy
gebruikt 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 strcpy
en strncpy
maken 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 strdup
een 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 strdup
een 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 free
voor elke malloc
/ calloc
kunt bellen. Maar functies zoals strdup
Introduceer een verborgen malloc
, en u moet het hetzelfde behandelen als een malloc
voor het doel van geheugenbeheer. (Nog een dergelijke verborgen toewijzingsfuncties is GCC’s abi::__cxa_demangle()
.) Pas op!
3, Autoriteit 14%
strdup
TOEKENT geheugen voor de nieuwe tekenreeks op de heap, terwijl u strcpy
(of de veiliger strncpy
VARIENT) 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 strdup
wordt gepresenteerd als:
ptr2 = malloc(strlen(ptr1)+1);
strcpy(ptr2,ptr1);
Dat is echter enigszins sub-optimaal omdat zowel strlen
en strcpy
nodig hebben om de lengte van de tekenreeks te vinden door te controleren of elk teken een \0
.
Gebruik memcpy
moet 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);
}