memcpy

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, 
constvoid* src, 
size_tcount 
void* ret = dst; 
#if defined (_M_MRX000) || defined (_M_ALPHA) || defined (_M_PPC) 
externvoidRtlMoveMemory( void*, constvoid*, size_tcount ); 
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,voidconst*srcaddr, size_tlen) 
char*dest = destaddr; 
charconst*src = srcaddr; 
while(len-- > 0) 
*dest++ = *src++; 
returndestaddr; 
}
Linux中:
1
2
3
4
5
6
7
8
9
10
void*memcpy(void*dest, constvoid*src, size_tcount) 
assert(dest != NULL && src != NULL); 
char*tmp = dest;    constchar*s = src; 
while(count--) 
*tmp++ = *s++ ; 
returndest; 
}
程序例example1
作用:將s中的字符串複製到字符數組d中。
1
2
3
4
5
6
7
8
9
10
11
12
// memcpy.c 
#include <stdio.h> 
#include <string.h> 
intmain() 
char*s="Golden Global View"
chard[20]; 
clrscr(); 
memcpy(d,s,( strlen(s)+1) ); 
printf("%s",d); 
getchar(); 
return0;
}
輸出結果:Golden Global View
example2
作用:將s中第14個字符開始的4個連續字符複製到d中。(從0開始) 
1
2
3
4
5
6
7
8
9
10
11
#include <string.h> 
intmain( 
char*s="Golden Global View"
chard[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(); 
return0; 
}
輸出結果: View
example3
作用:複製後覆蓋原有部分數據
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h> 
#include <string.h> 
intmain(void
charsrc[] = "******************************"
chardest[] = "abcdefghijlkmnopqrstuvwxyz0123as6"
printf("destination before memcpy: %s\n", dest); 
memcpy(dest, src, strlen(src)); 
printf("destination after memcpy: %s\n", dest); 
return0; 
}
輸出結果:
destination before memcpy:abcdefghijlkmnopqrstuvwxyz0123as6
destination after memcpy: ******************************as6

7與strcpy函數的區別編輯

strcpy和memcpy主要有以下3方面的區別。
1、複製的內容不同。strcpy只能複製字符串,而memcpy可以複製任意內容,例如字符數組、整型、結構體等。
2、複製的方法不同。strcpy不需要指定長度,它遇到被複制字符的串結束符"\0"才結束,所以容易溢出。memcpy則是根據其第3個參數決定複製的長度。
3、用途不同。通常在複製字符串時用strcpy,而需要複製其他類型數據時則一般用memcpy

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章