Ich habe gelesen, dass dies strcpy
zum Kopieren einer Zeichenfolge dient, und strdup
gebe 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 Sie bevorzugen strdup
?
strdup()
ed-Zeichenfolge kann über das Ende der aktuellen Funktion hinausgehen, aber das könnte trotzdem der Fall sein (wenn das Zielstrcpy()
ein vom Aufrufer bereitgestellter Puffer, eine globale Variable oder selbst manuell mitmalloc()
oder zugewiesen istnew
). .while(*ptr2++ = *ptr1++)
! :)Die Funktionen
strcpy
undstrncpy
sind Teil der C-Standardbibliothek und arbeiten mit vorhandenem Speicher. Das heißt, Sie müssen den Speicher bereitstellen, in den die Funktionen die Zeichenfolgendaten kopieren, und als Konsequenz müssen Sie über Ihre eigenen Mittel verfügen, um herauszufinden, wie viel Speicher Sie benötigen.Dies
strdup
ist eine Posix-Funktion, die eine dynamische Speicherzuweisung für Sie durchführt. Es gibt einen Zeiger auf den neu zugewiesenen Speicher zurück, in den die Zeichenfolge kopiert wurde. Aber Sie sind jetzt für diese Erinnerung verantwortlich und müssen sie schließlichfree
.Das macht
strdup
eine der "verstecktenmalloc
" Komfortfunktionen aus, und das ist vermutlich auch der Grund, warum sie nicht Teil der Standardbibliothek ist. Solange Sie die Standardbibliothek verwenden, wissen Sie, dass Siefree
für jedesmalloc
/ eine aufrufen müssencalloc
. Aber Funktionen wie dasstrdup
Einführen eines verstecktenmalloc
, und Sie müssen es genauso behandeln wie einmalloc
zum Zweck der Speicherverwaltung. (Eine weitere solche versteckten Zuordnungsfunktionen sind GCCsabi::__cxa_demangle()
.) Vorsicht!quelle
strdup
Speicher reserviert für den neuen String auf dem Heap, während der Verwendungstrcpy
(oder dessen sichererstrncpy
varient) ich auf einen String in einen vorher zugewiesenen Speicher kopieren kann entweder den Heap oder den Stapel.quelle
strcpy
in einen statischen Puffer zu kopieren?In der akzeptierten Antwort wird die Implementierung von wie
strdup
folgt dargestellt:ptr2 = malloc(strlen(ptr1)+1); strcpy(ptr2,ptr1);
Dies ist jedoch etwas suboptimal, da beide
strlen
undstrcpy
die Länge der Zeichenfolge ermitteln müssen, indem geprüft wird, ob jedes Zeichen a ist\0
.Die Verwendung
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); }
quelle
strcpy
Implementierungstrdup
von der praktischen Anwendbarkeit auf effiziente Weise trennt .while ( len-- ) { *ptr2++ = *ptr1++ }
, das jedes Mal eine Subtraktion, Zuweisung und einen Test für Null durchführt und dann immer noch eine Zuweisung ausführen muss und dann trotzdem zwei Post-Inkremente und deren Zuweisungen. Diese Memcpy-Technik scheint also weniger effizient zu sein. Dies scheinen eher triviale Unterscheidungen und imaginäre Optimierungen zu sein.char *strdup(char *pszSrch)
;;strdup
weist dem Speicher die Größe der ursprünglichen Zeichenfolge zu. Wenn die Speicherzuordnung erfolgreich ist, wird die ursprüngliche Zeichenfolge in die doppelte Zeichenfolge kopiert.strdup
d RückkehrNULL
bei Ausfall. Wenn der Speicher nicht zugeordnet ist, schlägt fehl Kopiestrdup
RückkehrNULL
.quelle