Wann sollte man strncpy oder memmove verwenden?

Wann sollte man strncpy oder memmove verwenden?

strncpy() wird verwendet, um Daten von einer Quelle zu einem Ziel einer festgelegten Größe zu kopieren, wobei 0x00 kopiert (aufgefüllt) wird s wenn ein 0x00 Byte wird im Quellarray (String) vor dem Ende des Puffers gefunden. Im Gegensatz zu strcpy die für immer bis zu einem 0 glückselig kopieren wird Byte gefunden wird - selbst wenn dieses Byte weit außerhalb Ihres Puffers liegt.

memcpy() wird verwendet, um von der Quelle zum Ziel zu kopieren, unabhängig davon, was die Quelldaten enthalten. Es neigt auch dazu, sehr hardwareoptimiert zu sein und liest oft Systemwörter (int s/long s), um das Kopieren zu beschleunigen, wenn die Ausrichtung dies zulässt.

memmove() wird verwendet, um aus einem überlappenden Quell- und Zielbereich zu kopieren (z. B. den Inhalt eines Arrays in sich selbst oder etwas Ähnliches zu verschieben - daher die Bewegungs-Mnemonik). Es verwendet Strategien (z. B. möglicherweise das Kopieren von Daten, die von hinten statt von vorne beginnen), um sich vor Problemen zu schützen, die durch überlappende Bereiche verursacht werden. Es kann auch etwas weniger effizient sein, da es normalerweise nicht viel Hardwarehilfe gibt, um Daten von hinten nach vorne zu kopieren.

bcopy() und seine Verwandten (bzero , und ein paar andere) ist eine Byte-Kopierfunktion, die ich hin und wieder im eingebetteten Land gesehen habe. Normalerweise kopiert es Daten Byte für Byte von der Quelle zum Ziel, um Probleme mit falsch ausgerichteten Speicheradressen zu vermeiden, obwohl jeder gute memcpy wird damit umgehen, daher ist seine Verwendung oft verdächtig.

Viel Glück!


Sie sollten niemals strncpy verwenden (es sei denn, Sie haben es mit dieser seltenen spezifischen Situation zu tun, für die es eingeführt wurde). Die Funktion ist nicht für die Verwendung mit nullterminierten C-Strings vorgesehen. Der Name, der dieser Funktion gegeben wurde, ist nur ein historischer Fehler und ist zufällig die Hauptquelle der Verwirrung für die Leute, die versuchen, sie zu verwenden. strncpy ist eine Funktion, die eingeführt wurde, um sogenannte Zeichenfolgen mit "fester Breite" zu unterstützen, nicht nullterminierte Zeichenfolgen. Mit strncpy mit nullterminierten Strings ist eine schlechte Programmierpraxis, auch wenn Sie es für diesen Zweck in eine Art "Arbeiten" bringen können.

Eine Funktion zum "sicheren" Kopieren von Zeichenfolgen mit begrenzter Länge existiert nicht in der C-Bibliothek, einige Implementierungen bieten sie jedoch unter dem Namen strlcpy an , was bereits zu einem De-facto-Standardnamen für diese Funktion geworden ist. Wenn Ihre Implementierung strlcpy nicht bereitstellt , implementieren Sie es selbst.

Außerdem stimmt es, dass Sie in vielen Fällen str... ersetzen können Funktion mit mem... Funktionen, d.h. wenn Sie die genaue Anzahl der zu kopierenden Zeichen kennen.


strcpy (und andere str*-Methoden) stoppen, wenn sie auf ein NULL (0)-Byte stoßen. memcpy und verwandte Funktionen, NICHT zu stoppen, wenn sie auf ein NULL-Byte stoßen.

Wenn Sie Binärdaten haben, müssen Sie memcpy verwenden. In Ihrem Beispiel kopieren Sie Binärdaten, keine Zeichenfolgendaten.

strncpy ist ein Sonderfall, bei dem das Kopieren bei einem NULL-Byte beendet wird, die Ausgabe jedoch weiterhin mit NULLen bis zur angegebenen Länge aufgefüllt wird.