について次の記事を読んだ後、次の記事memcpy()
に進みましたmemmove()
。
To avoid overflows, the size of the arrays pointed by both the destination and source parameters, shall be at least num bytes, and should not overlap (for overlapping memory blocks, memmove is a safer approach).
(リンク)
そして、動作を説明するために使用されたプログラムを確認した後、出力がどのように異なるかを代わりにmemmove()
使用して微調整することにしました.驚いたことに、メモリブロックが重複している場合でも同じです.プログラムと出力、そしてその後の私の混乱を説明し始めました:memcpy()
#include <stdio.h>
#include <string.h>
int main ()
{
char str[] = "memmove can be very useful......";
//memmove (str+20,str+15,11);
memcpy(str+20,str+15,11); //Simply used memcpy instead of memmove
puts (str);
return 0;
}
出力 memmove can be very very useful.
この出力は、の場合と同じです。memmove()
そして、ここに私の混乱があります:
1)両方の出力が同じmemcpy()
である理由str+15
? str+20 位置の文字まで、これは str+15 位置の文字に変更され、str+25 位置にコピーされます。しかし、そうではなく、上書きはなく、中間バッファーのように機能します。元の文字列を正確に記述するために使用されます。str+20
str+16
str+21
memmove can be very useful...... //Original positions before memcopy
^ ^
str+15 str+20
memmove can be very vseful......
^ copies str+15 to str+20
memmove can be very veeful......
^ copies str+16 to str+21
memmove can be very verful......
^ copies str+17 to str+22
memmove can be very veryul......
^copies str+18 to str+23
memmove can be very very l......
^ copies str+19 to str+24
memmove can be very very v......
^ I expect 'v' to be copied from str+20 to str+25
as str+20 now has 'v',not 'u'
memmove can be very very ve.....
^ I expect 'e' to be copied from str+21 to str+26
as str+21 now has 'e' not 's'
次に、 memmove が非常に非常に v になるのではなく、 memmove が非常に非常に役立つ可能性があるため、 memcpy() がそれをコピーするのはなぜですか?
2)現在、そこから生じるマイナーな二次的な質問です。memmove()
( LINK )について次のように述べられています。
Copying takes place as if an intermediate buffer were used, allowing the destination and source to overlap.
ここにあるのは一体何as if
? 中間バッファーは本当に何に使われるのmemmove()
でしょうか?