一.memcpy的使用和模拟实现
void*memcpy(void*dest,const void*src,size_t num)
1.函数memcpy从src的位置向后复制num个字节到dest指向的内存位置
2.这个函数在遇到‘\0’的时候不会停下来
3.如果dest与src有任何的重叠,复制的结果都是未定义的
模拟实现:
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的使用和模拟实现
void * memmove( void * dest, const void * src, size_t num )
1.和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的
2.如果源空间和目标空间出现重叠,就得使用memmove函数处理
模拟实现:
void* my_memmove(void* dest, const void* src, size_t num)
{
void* ret = dest; //记录目标内存的起始位置
assert(dest && src); //添加断言,防止出现空指针异常
while (num)
{
*(char*)dest = *(char*)src; //将src和dest强转为字符型指针,再复制移动内容。
dest = (char*)dest + 1; //dest指针移动到下一个字节处
src = (char*)src + 1; //src指针移动到下一个字节处
num--;
}
return ret;
}
三.memset函数的使用和模拟实现
void * memeset (void * ptr,int value,size_t num)
memset是用来设置内存的,将内存中的值以字节为单位设置成想要的内容
模拟实现:
void* my_memset(void* e1,int val,size_t num)
{
void* ret = e1;
assert(e1 != NULL);
while(num--)
{
*(char*)e1 = (char)val;
e1 = (char*)e1 + 1;
}
return ret;
}
四.memcmp的使用和模拟实现
int memcmp(const void * ptr1,const * str2,size_t num)
比较从ptr1到ptr2指针指向的位置开始,向后num个字节
模拟实现:
int my_memcmp(const void* ptr1,const void* ptr2,size_t num)
{
assert(ptr1 != NULL);
assert(ptr2 != NULL);
while(num--)
{
if(*(char*)ptr1 != *(char*)ptr2)
{
return *(char*)ptr1 - *(char*)ptr2;
}
ptr1 = (char*)ptr1 + 1;
ptr2 = (char*)ptr2 + 1;
}
return 0;
}