1 memcpy函数
原型:
char* memcpy(void* dest,const void* src,size_t count)
功能:
把src指向的内容拷贝到dest目标空间中去,但由于dest类型是void*,src类型是const void*,
size_t count是指要拷贝多少个字节;
(const使* src不能修改,当然解引用之前要强制类型转换,void*类型指针不能直接解引用)
所以可以拷贝任何类型的数据。以拷贝整型数据为例:
最后会返回目标空间的起始地址
实现方法:
void* my_memcpy(void* dest,const void* src, size_t count)
{
assert(dest && src);
//思路:将void*转换成char*,1个字节1个字节地拷贝
void* re = dest;
while (count)
{
*(char*)dest = *(char*)src;//必须强制类型转换,因为void*类型不能解引用
dest = (char*)dest + 1;//要指定指针变量的具体类型才能+1
src = (char*)src + 1;//void*可以接收任何类型的地址
count--;
}
return re;
}
缺陷:
此时重叠部分的数字3已经被修改,所以memcpy不能有效处理重叠的内存拷贝
2 memmove函数
原型:
char* memmove(void* dest, const void* src, size_t count)
功能:
在memcpy的基础上,可以实现重叠内存拷贝.
改进:
为了防止在拷贝重叠部分之前,重叠部分已经被修改,
可以先拷贝重叠部分的内容,再拷贝非重叠部分的内容.
而重叠部分会出现在源地址内容的首部或尾部。
实现方法:
void* my_memmove(void* dest, const void* src, size_t count)
{
assert(dest && src);
if (dest > src)
{
//从后向前拷贝,因为重叠部分只会出现在源空间尾部
while (count--)
{
*((char*)dest + count) = *((char*)src + count);
}
return dest;//dest并没有改变
}
else if (dest < src)
{
//从前往后拷贝,因为重叠部分只会出现在源空间首部
void* re = dest;//这里dest会改变
while (count--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return dest;
}
else
{
//没有任何改变
//自我拷贝
return dest;
}
}
3 memcmp函数
原型:
int memcmp(const void* buf1, const void* buf2, size_t count)
功能:
比较buf1和buf2开始的count个字节的内容
buf1 > buf2 返回>0的数字;
buf1== buf2 返回0;
buf < buf2 返回<0的数字.
4 memset函数
原型:
void* memset(void* dest, int c, size_t count)
功能:
把从dest开始的count个字节的内容都设成c.(以字节为单位初始化为c)
例:
设置前:
设置后: