Beim Lesen über Memmove habe ich gelesen, dass es MEMORY OVERLAPS behandeln kann, aber ich kann nicht herausfinden, wie eine Speicherüberlappung zwischen zwei Zeichenfolgen auftreten kann und wie diese Funktion den Speicherblock immer noch korrekt kopieren kann.Wie erfolgt die Speicherüberlappung und wie wird sie kontrolliert?
Antwort
"Speicherüberlappung" tritt nicht von selbst auf. Sie können die Funktion memmove
mit überlappenden Speicherbereichen versorgen. Nehmen Sie zwei Zeiger in das gleiche Array und Sie können leicht mit überlappenden Speicherregionen enden.
Natürlich können Sie überlappende Objekte auch leicht durch Verbindungen erstellen.
Es ist nicht klar, was Sie mit dem zweiten Teil der Frage meinen ("wie kann diese Funktion den Speicherblock immer noch korrekt kopieren"). Wo siehst du das Problem hier?
memmove(p+1, p, 42);
Das erfordert das Verschieben der Bytes beginnend am Ende. Memcpy() macht ein Durcheinander.
Genau genommen hat 'memcpy' ein undefiniertes Verhalten, wenn es auf diese Weise verwendet wird. Es könnte denkbar sein, dass es funktioniert, zum Beispiel, wenn geschrieben wird, dass Rückwärtskopieren schneller ist, oder wenn 'memcpy' nur als Aufruf von' memmove' implementiert wurde, aber Sie sollten sich niemals auf solche Dinge verlassen. :-) –
warum würde man memcpy überhaupt benutzen, wenn er memmove kennt;) –
Weil memcpy() schneller ist. –
- 1. Wie erfolgt die Systemintegration?
- 2. Wie kontrolliert Mysql Abfrage Ausführungszeit?
- 3. Wie erfolgt die Dereferenzierung eines Funktionszeigers?
- 4. Wie erfolgt die Faltung mit RGB-Kanal?
- 5. Wie erfolgt die Zeitaufteilung in Javascript?
- 6. Wie erfolgt die Partitionierung in Hazelcast?
- 7. Wie erfolgt die dynamische Skriptauswertung in C#?
- 8. Wie erfolgt die Typumwandlung in JavaScript?
- 9. Wie erfolgt die Authentifizierung in Ruhe?
- 10. Wie erfolgt die benutzerdefinierte Validierung von FileHelpern?
- 11. Wie kontrolliert man Ressourcenverarbeitung während Java Build?
- 12. Wie erfolgt die Kommunikation mit einem Container?
- 13. Wie Speicherzuweisung in scala erfolgt
- 14. Wie kontrolliert man die Bandbreite der Ajax-Anfrage?
- 15. Wie kontrolliert man die Reihenfolge der Doxygen-Dokumentationsabschnitte?
- 16. Wie man eine untere Blattbreite kontrolliert?
- 17. Was wird von textColorPrimary beeinflusst und wie man seine Nebenwirkungen kontrolliert?
- 18. Wird die Reihenfolge in Arrays beibehalten, wenn die Überschneidung erfolgt?
- 19. Wie erfolgt die Bindung des Global.asax PostAuthenticateRequest-Ereignisses?
- 20. Wie erfolgt die Verkettung der letzten Strings in Java?
- 21. Wie erfolgt die Speicherzuweisung für Variablen in Skriptsprachen?
- 22. Wie erfolgt die CPU-Zuweisung in Linux? Threadlevel oder Prozesslevel?
- 23. Wie erfolgt die Übermittlung eines R-Pakets an CRAN und wie lange dauert jeder Schritt?
- 24. Wie erfolgt die Initialisierung der bedingten Variablen zur Compilerzeit?
- 25. Wie erfolgt die Kontextumschaltung von Threads auf einem Multicore-Prozessor?
- 26. SQL ON DELETE CASCADE, wie erfolgt die Löschung?
- 27. Wie erfolgt das Routing in ASP.NET MVC?
- 28. Wie erfolgt die automatische Vervollständigung in C9 IDE?
- 29. Wird die Dependency-Injektion empfohlen, wenn keine Mehrfachimplementierung erfolgt?
- 30. Wie erfolgt die Versionsnummerierung in einem agilen Projekt?
Ich bekomme nicht, wie eine Funktion Speicher überlappende Problem behandeln würde –
Es funktioniert, als ob die Quelle in einen anderen Puffer kopiert und dann an das Ziel kopiert wurde. Memcpy() kopiert die Quelle jedoch direkt zum Ziel. – Jefferson