您的位置:首页 > 编程语言 > C语言/C++

【c语言】模拟实现memcpy()、memmove()函数

2017-01-14 18:42 567 查看
//memcpy

1.memcpy和memmove可对内存中任何数据类型进行拷贝,但strcpy仅可以对字符串进行拷贝;

2.memcpy函数原型:void* memcpy(void *dst,const void* src,size_t n);

从源src所指内存的起始地址开始拷贝n个字节到目标dst所指向的起始地址。

3.memmove函数原型和memcpy函数原型是一致的,但当dst内存区域和dst内存区有重叠时,memmove的结果是正确的,memcpy不能保证结果正确性,memcpy要比memmove效率要快

#pragma warning (disable:4996)
#include<stdio.h>
#include<windows.h>
#include<assert.h>

void *my_memcpy(void* dst, const void * src, size_t n)
{
assert(dst);
assert(src);

char* _dst = (char*)dst;
const char* _src = (const char*)src;
while (n--)
*_dst++ = *_src++;
return dst;
}

int main()
{
char *s = "hello world";
char d[20];
my_memcpy(d, s, strlen(s));
d[strlen(s)] = '\0';
printf("%s", d);
system("pause");
return 0;
}

//memmove

原型:extern void *memmove(void *dest,const void *src, unsigned int count);

功能:由src所指的内存区域复制count个字节到dest所指的内存区域。

说明:src和dest所指内存区域可以重叠,但复制后src内容会被更改。函数返回指向dest的指针。

      

src和dest可能存在的内存分布情况如下图:



#pragma warning (disable:4996)
#include<windows.h>
#include<stdio.h>
#include<assert.h>
#include<string.h>

void *my_memmove(char *dest, const char *src, size_t count)
{
assert(dest);
assert(src);

void *d = dest;
if (dest < src && (char *)src < (char *)dest + count)
{
while (count--)
{
//顺序
*(char*)d = *(char*)src;
d = (char*)d + 1;
src = (char*)src + 1;
}
}
else
{
d = (char*)d + count - 1;
src = (char*)src + count - 1;
// 逆序
while (count--)
{
*(char*)d = *(char*)src;
d = (char*)d - 1;
src = (char*)src - 1;
}
}
return dest;
}

int main()
{
char a[256] = "Do not spit grape skins while eating grapes";
my_memmove(a + 1, a, strlen(a) + 1);
printf("%s\n", a);
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: