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;
}