Namespaces
Variants

std:: memmove

From cppreference.net
Definiert im Header <cstring>
void * memmove ( void * dest, const void * src, std:: size_t count ) ;

Führt die folgenden Operationen in der angegebenen Reihenfolge aus:

  1. Erstellt implizit Objekte an dest .
  2. Kopiert count Zeichen (als ob vom Typ unsigned char , im Folgenden gleich) vom Objekt, auf das src zeigt, in ein temporäres Array arr von count Zeichen, wobei arr sich nicht mit den Objekten überschneidet, auf die dest und src zeigen.
  3. Kopiert count Zeichen von arr in das Objekt, auf das dest zeigt.

Wenn dest oder src ein Nullzeiger oder ungültiger Zeiger ist, ist das Verhalten undefiniert.

Inhaltsverzeichnis

Parameter

dest - Zeiger auf den Speicherbereich, in den kopiert werden soll
src - Zeiger auf den Speicherbereich, aus dem kopiert werden soll
count - Anzahl der zu kopierenden Bytes

Rückgabewert

Falls ein geeignetes erstelltes Objekt vorhanden ist, gibt es einen Zeiger darauf zurück; andernfalls wird dest zurückgegeben.

Hinweise

Obwohl die Spezifikation besagt, dass ein temporärer Puffer verwendet wird, verursachen tatsächliche Implementierungen dieser Funktion nicht den Aufwand von doppeltem Kopieren oder zusätzlichem Speicher. Für kleine count kann es Register laden und zurückschreiben; für größere Blöcke ist ein gängiger Ansatz (glibc und bsd libc), Bytes vorwärts vom Anfang des Puffers zu kopieren, wenn das Ziel vor der Quelle beginnt, und rückwärts vom Ende andernfalls, mit einem Fallback zu std::memcpy wenn es überhaupt keine Überlappung gibt.

Wo strict aliasing die Untersuchung desselben Speichers als Werte zweier unterschiedlicher Typen verbietet, std::memmove zur Konvertierung der Werte verwendet werden kann.

Beispiel

#include <cstring>
#include <iostream>
int main()
{
    char str[] = "1234567890";
    std::cout << str << '\n';
    std::memmove(str + 4, str + 3, 3); // kopiert von [4, 5, 6] nach [5, 6, 7]
    std::cout << str << '\n';
}

Ausgabe:

1234567890
1234456890

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
LWG 4064 C++98 es war unklar, ob der zurückgegebene Zeiger auf ein geeignet erstelltes Objekt zeigt klargestellt

Siehe auch

kopiert einen Puffer in einen anderen
(Funktion)
füllt einen Puffer mit einem Zeichen
(Funktion)
kopiert eine bestimmte Anzahl von Breitzeichen zwischen zwei, möglicherweise überlappenden, Arrays
(Funktion)
kopiert einen Bereich von Elementen an einen neuen Speicherort
(Funktions-Template)
kopiert einen Bereich von Elementen in umgekehrter Reihenfolge
(Funktions-Template)
prüft, ob ein Typ trivial kopierbar ist
(Klassen-Template)
C-Dokumentation für memmove