2017-04-19 6 views
2

私はmemmove()を使用していますが、宛先がソースを上書きしているか、上書きが何であるかわからないことがあります。私はchar(目的地)の配列を持っていて、目的地へのポインタをベクター内に持っています。Memmoveがオーバーラップしています

char destination[]="abcdefg"; 
char * source = destination+3; 

ソースは"defg"です。次に、memmove()を使用して4文字を移動し、ソースを印刷します。ソースを見ると、"gefg"に変更されました。

printf("%s\n",memmove(destination,source,sizeof(char)*4)); 
printf("%s",source); 

私はmemmove()が上書きされるのを防ぐべきであると考え、または多分私は理解していないです。

+0

ソース(まだdest + 3)ではなく、デスティネーションを見てください。 (注: 'sizeof(char)'は定義上1) – wildplasser

+2

'memmove'は、領域が重なってもバイトをコピーすることを意味します。 –

+1

はい、残念ですが、重複しないで上書きします。 –

答えて

2

memmoveは、ソースと宛先が重複する領域を持つことを許可し、memmoveより前のソースの内容がmemmoveの後の宛先の内容と等しくなるように定義されています。

ソースと宛先が重複している場合は、memmoveコール後に何らかの方法でソースが変更されていることが予想されます。防止されているのは、宛先の破損の可能性です。

memmove(dst, src, len)の挙動はのようになります。

char buf[len]; 
memcpy(buf, src, len); 
memcpy(dst, buf, len); 

しかし、実装はむしろ2より、単一パスのみを行うために最適化されています。

関連する問題