1. 先看memcpy的原型
原型:extern void *memcpy(void *dest, void *src, unsigned int count);
用法:#include <string.h>;
功能:由src所指内存区域复制count个字节到dest所指内存区域。
说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针(VC6下可以重叠,后面给出验证)。
|
2. 内存布局情况
1)源地址和目的地址不重叠;
low--------------->high(大端模式)
src
|------------|
|-----------| |------------|
dest dest
2)源地址和目的地址重叠;
src
|---------------------|
|---------------------|
dest
3. 实现
如果没有重叠,直接从源地址的开始方向复制;如果目标地址在源区域内(dest>src && dest从源地址的末尾开始反方向复制。
4.源码(C实现,VC6.0)
#include <stdio.h>
#include <string.h>
#define LEN 5
void *myMemCopy(void *dest,const void *src,size_t count)
{
char *pDest=(char *)(dest);
const char *pSrc=(const char *)(src);
//目的地址和源地址重叠,从源地址的末尾方向开始拷贝
if( pDest>pSrc && pDest<pSrc+count )
{
pDest = pDest + count-1;
pSrc = pSrc + count-1;
while(count--){
*pDest-- = *pSrc--;
}
}
//目的地址和源地址不重叠,从源地址的开始方向拷贝
else {
while(count--){
*pDest++ = *pSrc++;
}
}
return pDest;
}
void printString(char *str, unsigned int n)
{
while(n--){
putchar(*str++);
}
putchar('\n');
}
int main()
{
char str1[] = "hello, world!";
char str2[] = "hello, world!";
myMemCopy(str1+1, str1, LEN); printString(str1+1, LEN);
memcpy(str2+1, str2, LEN);
printString(str2+1, LEN);
return 0;
}
|
5. 参考目录
1.
阅读(3520) | 评论(0) | 转发(1) |