memcpy
目 錄
1函數原型
void *memcpy(void *dest, const void *src, size_t n);
2功能
從源src所指的內存地址的起始位置開始拷貝n個字節到目標dest所指的內存地址的起始位置中
3所需頭文件
C語言中使用#include <string.h>;
C++中使用#include <cstring>; [cstring是C++在移植C的頭文件時前面會加字母'c' ]
4返回值
函數返回dest的值。
5說明
1.source和destin所指的內存區域可以重疊,但是如果source和destin所指的內存區域重疊,那么這個函數並不能夠確保source所在重疊區域在拷貝之前被覆蓋。而使用memmove可以用來處理重疊區域。函數返回指向destin的
指針。
2.strcpy和memcpy主要有以下3方面的區別。
2.2、復制的方法不同。strcpy不需要指定長度,它遇到被復制字符的串結束符"\0"才結束,所以容易溢出。memcpy則是根據其第3個參數決定復制的長度。
2.3、用途不同。通常在復制字符串時用strcpy,而需要復制其他類型數據時則一般用memcpy
3.如果目標數組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中:
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中:
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中。
// 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開始)
#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
作用:復制后覆蓋原有部分數據
#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