memcpy的作用
函数
memcpy
从
source
的位置开始向后复制
num
个字节的数据到
destination
的内存位置。
这个函数在遇到
'\0'
的时候并不会停下来。
如果
source
和
destination
有任何的重叠,复制的结果都是未定义的。
该函数的定义形式为
void *
memcpy
(
void *
destination
,
const
void *
source
,
size_t
num
);
~这里解释一下为什么形参类型和返回类型是 void*
首先,在实际参数传过来之前,该函数是不知道传过来的参数类型是什么类型,而这里的 void*
就是指任意类型,就是不管你是什么类型,只要传过来,我就能进行拷贝。
而函数的返回类型是 void*,是一个指针,该指针指向的是拷贝完后目标的内存位置。
这样写的好处是可以实现函数的链式访问。
memcpy 和 strcpy 、strncpy的区别
strcpy 和strncpy 都是针对字符串使用的,是字符串函数。
而memcpy是内存操作函数
如何实现memcpy
下面是代码
void* my_memcpy(void* dest, const void*src, size_t count)
{
assert(dest && src);
void* ret = dest;
while(count--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
memmove的作用
虽然已经有了memcpy这个函数,但是针对一些特殊情况却不能解决,比如说在同一个数组中进行数据的拷贝,于是,自然而然就有了memmove这个函数。
和
memcpy
的差别就是
memmove
函数处理的源内存块和目标内存块是可以重叠的。
如果源空间和目标空间出现重叠,就得使用
memmove
函数处理。
其定义形式为
void *
memmove
(
void *
destination
,
const
void *
source
,
size_t
num
);
大体上和memcpy没有什么区别
如何实现memmove
void* my_memmove(void* dest, const void*src, size_t count)
{
assert(dest && src);
void* ret = dest;
if (dest < src)
{
//前->后
while (count--)
{
*(char*)dest = *(char*)(src);
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else
{
//后->前
while (count--)
{
*((char*)dest+count) = *((char*)src + count);
}
}
return ret;
}
这就是以上内容了。