2

重複の可能性:
memcpyとmemmove

memmove実際にメモリのチャンクを「移動」しますか?もしそうなら、それはゼロでメモリを残しますか?それとも、memcpyのようなものですか?私はmanページを見ていますが、私の仮定が正しいとは思いません。memmoveを使用してメモリのチャンクを移動したい場合、移動を行ったメモリのチャンクを手動でゼロにする必要がありますか?

4

2 に答える 2

4

そうではありません:

との主な違いは、memmove移動しようとしているメモリ ブロックと重複する場所にメモリの一部を再配置するために使用できることです。したがって、元のポインターは無効になります。memcpymemmove

memcpy一方、 では、2 つの領域が重なることはありません。

memmoveただし、元のメモリ ブロックはゼロにしません。それを行いたい場合は、memsetを使用して明示的に自分で行う必要があります。原則として、C ルーチンは、メモリをゼロにするなど、不要な処理を行ってサイクルを浪費しません。malloc同様にメモリブロックをゼロにしない と比較してください。

于 2011-05-04T00:21:39.793 に答える
4

memmove古いメモリをクリアすることとは何の関係もありません。実際、使用したい唯一の状況ではmemmove、古いメモリをクリアすると、コピーしたばかりのデータが破壊されます! これmemmoveは、ソース範囲と宛先範囲が重複することが予想される場合にのみ役立つためです。

通常、 が必要memmoveな場合は、設計に重大な根本的な非効率性があることを示しています。たとえば、新しい C プログラマーは、文字列の末尾にorを使用するだけでなくmemmove、文字列の最初の数文字を削除するために を使用しようとすることがよくあります (例: )。ほとんど含まれていないアルゴリズムは、O(n^2) よりも優れたパフォーマンスを発揮します。memmove(s, &s[1], len)s+1&s[1]memmove

于 2011-05-04T00:27:44.367 に答える