1. 程式人生 > >memcpy函式 和 memmove函式 原碼

memcpy函式 和 memmove函式 原碼

原型:extern void *memcpy(void *dest, void *src, unsigned int count);

用法:#include <string.h>

功能:由src所指記憶體區域複製count個位元組到dest所指記憶體區域。

說明:src和dest所指記憶體區域不能重疊,函式返回指向dest的指標。

舉例:

      // memcpy.c

     

      #include <syslib.h>

      #include <string.h>

      main()

      {

        char *s="Golden Global View";

        char d[20];

       

        clrscr();

       

        memcpy(d,s,strlen(s));

        d[strlen(s)]=0;

        printf("%s",d);

        getchar();

        return 0;

      }

http://www.ggv.com.cn/forum/clib/string/memcpy.html此連結有許多字串函式可以查詢。

看下面這個程式碼:

void *memcpy(void *dest,void *src, unsigned int count)

{

assert((dest!=NULL)&&(src!=NULL));

if(dest==src)

return src;

char* d=(char*)dest;

char* s=(char*)src;

while(count--> 0)

*d++=*s++;

return dest;

}

這是一個memcpy的原始碼,可以看看,在函式裡面生成臨時指標,這樣不會改變原始指標

函式原型:extern void *memmove(void *dest, const void *src, unsigned int count)

引數說明:dest為目的字串,src為源字串,count為要拷貝的位元組數。

       

所在庫名:#include <string.h>

函式功能:將字串src中的前n個位元組拷貝到dest中。

返回說明:src和dest所指記憶體區域可以重疊,函式返回void*型別指標。 www.yueluo.net

其它說明:功能於memcpy相同。

不同的是,當src和dest所指的記憶體區域重疊時,memmove()仍然可以正確的處理,不過執行效率上會比使用memcpy()略慢些

memcpy()、 memmove()和memccpy()

-------------------------------------------------------

    這三個函式的功能均是將某個記憶體塊複製到另一個記憶體塊。前兩個函式的區別在於它們處理記憶體區域重疊(overlapping)的方式不同。第三個函式的功能也是複製記憶體,但是如果遇到某個特定值時立即停止複製。

    對於庫函式來說,由於沒有辦法知道傳遞給他的記憶體區域的情況,所以應該使用memmove()函式。通過這個函式,可以保證不會出現任何記憶體塊重疊問題。而對於應用程式來說,因為程式碼“知道”兩個記憶體塊不會重疊,所以可以安全地使用memcpy()函式。

-------------------------------------------------------

#include <string.h>

#include <stdio.h>

int main()

{

    char s[] = "zengxiaolong";

    memmove(s, s+4, strlen(s)-4);

    s[strlen(s)-4] = '\0';

    printf("*s = %s\n", s);

    return 0;

}

memcpy與strncpy區別

    strncpy是把Num個字元從src複製到dest,但是如果遇到src字元結尾,那麼複製提前結束,後面沒有複製完的字元,不予以處理,當然dest,src地址不能重疊,

    memcpy也是把Num個字元從src複製到dest,但是它是記憶體複製,不管是不是NULL,照樣通吃


原型:extern void *memmove(void *dest, const void *src, unsigned int count); 
功能:由src所指記憶體區域複製count個位元組到dest所指記憶體區域。 
說明:src和dest所指記憶體區域可以重疊,但複製後src內容會被更改。函式返回指向dest的指標。 
功能類似於memcpy,不同的是memcpy記憶體區域不可重疊

例子: 
char *p="hello world!"; 
char *q=(char*)malloc(sizeof(char)*strlen(p)); 
memmove(q,p,sizeof(p)+1);


1.memmove

函式原型:void *memmove(void *dest, const void *source, size_t count)

返回值說明:返回指向dest的void *指標

引數說明:dest,source分別為目標串和源串的首地址。count為要移動的字元的個數

函式說明:memmove用於從source拷貝count個字元到dest,如果目標區域和源區域有重疊的話,memmove能夠保證源串在被覆蓋之前將重疊區域的位元組拷貝到目標區域中。 
memmove(),如果兩函式重疊,賦值仍正確進行。 
如果你不能保證是否有重疊,為了確保複製的正確性,你必須用memmove

void *memmove(void *dest, const void *source, size_t count)   
{   
 assert((NULL != dest) && (NULL != source));   
 char *src_t, *dest_t;  
 src_t = (char *)source;    //需要進行強制型別轉換
 dest_t= (char *)dest;  
  //需要進行強制型別轉換
 if((dest <source) || (source + count) <dest))   
 {// 如果沒有重疊區域   
   while(count--)   
     *dest_t++ = *src_t++;   
}   
else  
{ //如果有重疊   
 source += count ;   
dest_t += count ;   
 while(count--)   
   *--dest_t = *--tmp;   
}   
return dest;   
}