memcpy指的是c和c++使用的記憶體拷貝函式,memcpy函式的功能是從源記憶體地址的起始位置開始拷貝若干個位元組到目標記憶體地址中。
基本介紹
- 中文名:記憶體拷貝函式
- 外文名:memcpy
- 函式原型:見正文
- 功能:拷貝n個位元組
- 返回值:指向dest的指針
- 所在頭檔案:<string.h>或<cstring>
函式原型,功能,所需頭檔案,返回值,說明,函式實現,程式實例,區別,
函式原型
void *memcpy(void *dest, const void *src, size_t n);
功能
從源src所指的記憶體地址的起始位置開始拷貝n個位元組到目標dest所指的記憶體地址的起始位置中
所需頭檔案
C語言:#include<string.h>
C++:#include<cstring>
返回值
函式返回指向dest的指針。
說明
1.source和destin所指的記憶體區域可能重疊,但是如果source和destin所指的記憶體區域重疊,那么這個函式並不能夠確保source所在重疊區域在拷貝之前不被覆蓋。而使用memmove可以用來處理重疊區域。函式返回指向destin的指針.
2.如果目標數組destin本身已有數據,執行memcpy()後,將覆蓋原有數據(最多覆蓋n)。如果要追加數據,則每次執行memcpy後,要將目標數組地址增加到你要追加數據的地址。
注意:source和destin都不一定是數組,任意的可讀寫的空間均可。
函式實現
Windows中
void* __cdecl memcpy(void* dst,const void* src,size_t count){ void*ret=dst;#if defined(_M_MRX000)||defined(_M_ALPHA)||defined(_M_PPC){ extern void RtlMoveMemory(void *,const void *,size_t count); RtlMoveMemory(dst,src,count);}#else /*defined(_M_MRX000)||defined(_M_ALPHA)||defined(_M_PPC)*//**copy from lower addresses to higher addresses*/while(count--){ *(char *)dst = *(char *)src; dst = (char *)dst+1; src = (char *)src+1;}#endif /*defined(_M_MRX000)||defined(_M_ALPHA)||defined(_M_PPC)*/return (ret);}
coreutils中
void* memcpy(void*destaddr,voidconst*srcaddr,size_tlen){ char* dest=destaddr; char const* src=srcaddr; while(len-->0) { *dest++ = *src++; } return destaddr;}
Linux中:
void *memcpy(void *to, const void *from, size_t n){ void *xto = to; size_t temp, temp1; if (!n) return xto; if ((long)to & 1) { char *cto = to; const char *cfrom = from; *cto++ = *cfrom++; to = cto; from = cfrom; n--; } if (n > 2 && (long)to & 2) { short *sto = to; const short *sfrom = from; *sto++ = *sfrom++; to = sto; from = sfrom; n -= 2; } temp = n >> 2; if (temp) { long *lto = to; const long *lfrom = from;#if defined(CONFIG_M68000) || defined(CONFIG_COLDFIRE) for (; temp; temp--) *lto++ = *lfrom++;#else asm volatile ( " movel %2,%3\n" " andw #7,%3\n" " lsrl #3,%2\n" " negw %3\n" " jmp %%pc@(1f,%3:w:2)\n" "4: movel %0@+,%1@+\n" " movel %0@+,%1@+\n" " movel %0@+,%1@+\n" " movel %0@+,%1@+\n" " movel %0@+,%1@+\n" " movel %0@+,%1@+\n" " movel %0@+,%1@+\n" " movel %0@+,%1@+\n" "1: dbra %2,4b\n" " clrw %2\n" " subql #1,%2\n" " jpl 4b" : "=a" (lfrom), "=a" (lto), "=d" (temp), "=&d" (temp1) : "0" (lfrom), "1" (lto), "2" (temp));#endif to = lto; from = lfrom; } if (n & 2) { short *sto = to; const short *sfrom = from; *sto++ = *sfrom++; to = sto; from = sfrom; } if (n & 1) { char *cto = to; const char *cfrom = from; *cto = *cfrom; } return xto;}
程式實例
程式例example1
作用:將s中的字元串複製到字元數組d中。
//memcpy.c#include <stdio.h>#include <string.h>int main(){ char* s="GoldenGlobalView"; char d[20]; clrscr(); memcpy(d,s,(strlen(s)+1)); //+1 是為了將字元串後面的'\0'字元結尾符放進來,去掉+1可能出現亂碼 printf("%s",d); getchar(); return 0;}
輸出結果:Golden Global View
example2
作用:將s中第13個字元開始的4個連續字元複製到d中。(從0開始)
#include<string.h>int main({ char* s="GoldenGlobalView"; char d[20]; memcpy(d,s+12,4);//從第13個字元(V)開始複製,連續複製4個字元(View) d[4]='\0';//memcpy(d,s+12*sizeof(char),4*sizeof(char));也可 printf("%s",d); getchar(); return 0;}
輸出結果: View
example3
作用:複製後覆蓋原有部分數據
#include<stdio.h>#include<string.h>int main(void){ char src[]="******************************"; char dest[]="abcdefghijlkmnopqrstuvwxyz0123as6"; printf("destination before memcpy:%s\n",dest); memcpy(dest,src,strlen(src)); printf("destination after memcpy:%s\n",dest); return 0;}
輸出結果:
destination before memcpy:abcdefghijlkmnopqrstuvwxyz0123as6
destination after memcpy: ******************************as6
區別
strcpy和memcpy主要有以下3方面的區別。
2、複製的方法不同。strcpy不需要指定長度,它遇到被複製字元的串結束符"\0"才結束,所以容易溢出。memcpy則是根據其第3個參數決定複製的長度。
3、用途不同。通常在複製字元串時用strcpy,而需要複製其他類型數據時則一般用memcpy