1.memcpy()的实现
函数原型:
char *memcpy(void * destination,const void * source,size_t num)
- 内存拷贝函数,从source的位置开始向后拷贝num个字节的数据到dest的内存位置。
- memcpy按字节拷贝,并不是只能拷贝字符串,所以没有‘\0’结束标志(遇到‘/0’不会停止),按指定是字节数大小拷贝
- str家族函数只能处理字符串类型的数据,而mem可以处理任意类型的数据
- 如果source和destination有任何重叠,复制的结果都是未定义的
void* my_memcpy(void * dest, void * src, size_t count)
{
assert(dest);
assert(src);
char* p = (char *)dest;
char* q = (char *)src;
while (count--)
{
*p = *q;
p++;
q++;
}
return dest;
}
//void变量 不能被定义,因为编译器不知道它的大小,但是void*变量可以被定义出来,因为它是个指针,可以接受任意类型的指针
memcpy函数在拷贝的时候可能出现内存重叠问题,导致结果与预期的不一样。此时就可以使用memmove()解决
memcpy从前向后拷贝,本来我们想要的结果是“hello worl”,但是它的第一个h拷过去以后,之后拷贝的都是h,如果用memmove拷贝他会从后向前拷贝从而解决内存重叠问题
2.memmove()的实现
函数原型:
voi * memmove(void * destination,const void * source,size_t num)
- 它也是内存拷贝函数,与memcpy的差别在于他可以解决内存重叠问题
- 如果原空间和目标空间出现重叠,就使用memmove函数处理
void* memmove(void *dest, void *src, size_t count)
{
void * ret = dest;
if (dest <= src || (char*)dest >= ((char*)src + count))
{
while (count--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else
{
dest = (char*)dest + count - 1;
src = (char*)src + count - 1;
while (count--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest - 1;
src = (char*)src - 1;
}
}
return(ret);
}