1函數原型編輯
void *memcpy(void *dest, const void *src, size_t n);
2功能編輯
從源src所指的內存地址的起始位置開始拷貝n個字節到目標dest所指的內存地址的起始位置中
3所需頭文件編輯
C語言中使用#include <string.h>;
C++中使用#include <cstring>和#include <string.h>都可以。前者只是爲了凸顯C++風格。
4返回值編輯
函數返回指向dest的指針。
5說明編輯
1.source和destin所指的內存區域可以重疊,但是如果source和destin所指的內存區域重疊,那麼這個函數並不能夠確保source所在重疊區域在拷貝之前被覆蓋。而使用memmove可以用來處理重疊區域。函數返回指向destin的指針.
2.如果目標數組destin本身已有數據,執行memcpy()後,將覆蓋原有數據(最多覆蓋n)。如果要追加數據,則每次執行memcpy後,要將目標數組地址增加到你要追加數據的地址。
注意:source和destin都不一定是數組,任意的可讀寫的空間均可。
6函數實現編輯
微軟中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | 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中:
1 2 3 4 5 6 7 8 9 10 | void * memcpy ( void *destaddr, void const *srcaddr, size_t len) { char *dest = destaddr; char const *src = srcaddr; while (len-- > 0) { *dest++ = *src++; } return destaddr; } |
Linux中:
1 2 3 4 5 6 7 8 9 10 | void * memcpy ( void *dest, const void *src, size_t count) { assert (dest != NULL && src != NULL); char *tmp = dest; const char *s = src; while (count--) { *tmp++ = *s++ ; } return dest; } |
程序例example1
作用:將s中的字符串複製到字符數組d中。
1 2 3 4 5 6 7 8 9 10 11 12 | // memcpy.c #include <stdio.h> #include <string.h> int main() { char *s= "Golden Global View" ; char d[20]; clrscr(); memcpy (d,s,( strlen (s)+1) ); printf ( "%s" ,d); getchar (); return 0; |
}
輸出結果:Golden Global View
example2
作用:將s中第14個字符開始的4個連續字符複製到d中。(從0開始)
1 2 3 4 5 6 7 8 9 10 11 | #include <string.h> int main( { char *s= "Golden Global View" ; char d[20]; memcpy (d,s+14,4); //從第14個字符(V)開始複製,連續複製4個字符(View) //memcpy(d,s+14*sizeof(char),4*sizeof(char));也可 d[4]= '\0' ; printf ( "%s" ,d); getchar (); return 0; } |
輸出結果: View
example3
作用:複製後覆蓋原有部分數據
1 2 3 4 5 6 7 8 9 10 11 | #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
7與strcpy函數的區別編輯
strcpy和memcpy主要有以下3方面的區別。
2、複製的方法不同。strcpy不需要指定長度,它遇到被複制字符的串結束符"\0"才結束,所以容易溢出。memcpy則是根據其第3個參數決定複製的長度。
3、用途不同。通常在複製字符串時用strcpy,而需要複製其他類型數據時則一般用memcpy