memmoveとmemcpyの違い

2704 ワード

テキストリンク:http://blog.chinaunix.net/uid-26495963-id-3080058.html
memcpyとmemmove()はいずれもC言語のライブラリ関数であり、ヘッダファイルstring.hでは一定長のメモリの内容をコピーする役割を果たし、原型はそれぞれvoid*memcpy(void*dst,const void*src,size_t count);void *memmove(void *dst, const void *src, size_t count);彼らの役割は同じで、唯一の違いは、メモリが局所的に重複している場合、memmoveはコピーの結果が正しいことを保証し、memcpyはコピーの結果が正しいことを保証しないことです.
memmove 和 memcpy的区别_第1张图片
1つ目の場合、重複する領域をコピーしても問題はなく、コンテンツが正しくコピーされる.2つ目の場合、問題は右側の2バイトに現れ、この2バイトの元の内容はまず上書きされ、保存されていません.だから次のコピーの時、コピーしたのはすでに上書きされた内容で、明らかにこれは問題があります.実際、memcpyはmemmoveのサブセットにすぎません.両者のc言語の実現は簡単で、興味のある友达は見に行くことができます.実際の状況では,この2つの関数はいずれもアセンブリで実現される.memmoveはcopyの2つの重複する領域のメモリがある時copyの正確さを保証することができて、memcopyはだめですが、memcopyはmemmoveの速度より少し速くて、例えば:char s[]=“1234567890”;char* p1 = s; char* p2 = s+2; memcpy(p 2,p 1,5)とmemmove(p 2,p 1,5)の結果は異なる可能性があり、memmove()はp 1の最初の5文字「12345」をp 2に正しくコピーすることができ、memcpy()の結果は必ずしもmemcpy()、memmove()、memccpy()が正しくない
-----------------------------------------------------------の3つの関数の機能は、いずれもあるメモリブロックを別のメモリブロックにコピーすることです.最初の2つの関数の違いは、メモリ領域のオーバーラップ(overlapping)を処理する方法が異なることです.3番目の関数の機能もメモリをコピーしますが、特定の値に遭遇した場合はすぐにコピーを停止します.ライブラリ関数では、彼に渡されるメモリ領域を知ることができないため、memmove()関数を使用する必要があります.この関数を使用すると、メモリブロックの重複の問題が発生しないことを保証できます.アプリケーションでは、コード「了解」の2つのメモリブロックが重複しないため、memcpy()関数を安全に使用できます.プロトタイプ:extern void*memccpy(void*dest,void*src,unsigned char ch,unsigned int count);使用法:#include機能:srcが指すメモリ領域からcountバイト以上destが指すメモリ領域にコピーし、文字chに遭遇した場合はコピーを停止します.説明:文字ch後の最初の文字を指すポインタを返し、src前のnバイトにchが存在しない場合はNULLを返します.chがコピーされます.char s[]="Goldenx Global View"; char d[20]; char *p; p=(char *)memccpy(d,s,'x',strlen(s)); if(p) {    *p='\0';//MUST Do This    printf("Char found: %s.",d); } else    printf("Char not found."); memmoveの実装について:
void *mymemmove(void *dest, const void *src, size_t n)
{
    char temp[n];
    int i;
    char *d = dest;
    const char *s = src;

    for (i = 0; i < n; i++) 
        temp[i] = s[i];
    for (i = 0; i < n; i++) 
        d[i] = temp[i];

    return dest;
}
void *mymemcpy(void *dest, const void *src, size_t n)
{
    char *d = dest;
    const char *s = src;
    int *di;
    const int *si;
    int r = n % 4;
    
    while (r--)
        *d++ = *s++;
    di = (int *)d;
    si = (const int*)s;
    n /= 4;
    while (n--)
        *di++ = *si++;

    return dest;
}