>memcpy:
void *memcpy(void *dest,const void *source,size_t num);
(1)函数memcpy从source的位置开始向后复制num个字节的数据到dest的内存位置。
(2)这个函数在遇到'\0'的时候并不会停下来。
(3)如果source和dest有任何的重叠,复制的结果都是未定义的。
void *my_memcpy(void *dest, const void *str, int size)
{
assert(dest);
assert(str);
assert(size > 0);
while (size--){
*(char *)dest = *(char *)str;
(char *)dest = (char *)dest + 1;
(char *)str = (char *)str + 1;
}
return dest;
}
适用于dest>source,如果dest<source就会内存从叠问题,从前往后拷贝时前一个会把后一个覆盖num个字节。这时就需要用到memmove。
>memmove:
void *memmove (void *dest,const char *str,int size);
(1)和memmove的差别就是memmove函数处理的源内存块的目标内存块是可以重叠的。
(2)如果源空间和目标空间出现重叠,就得使用memmove函数处理。
void *my_memmove(void *dest, const void *str, int size)
{
assert(dest);
assert(str);
assert(size > 0);
if (dest <=str || (char *)dest >= (char *)str + size){
while (size--){
*(char *)dest = *(char *)str;
(char *)dest = (char *)dest + 1;
(char *)str = (char *)str + 1;
}
}
else {
dest = (char *)dest + size - 1; //指针指向数组结尾
str = (char *)str + size - 1;
while (size--){
*(char *)dest = *(char *)str;
(char *)dest = (char *)dest- 1;
(char *)str = (char *)str- 1;
}
}
return dest;
}
>memcmp:int memcmp(const void *str1,const void *str2,size_t num);
比较从str1和str2指针开始的num个字节。
int my_memcmp(const void *str1, const void *str2, int size)
{
assert(str1);
assert(str2);
assert(size>0);
int ret = 0;
while (size&&(!(ret=*(unsigned char *)str1-*(unsigned char *)str2))&&(*(char *)str1)){
(char *)str1 = (char *)str1+1;
(char *)str2 = (char *)str2+1;
size--;
}
if (ret > 0)
printf("str1>str2\n");
else if(ret<0)
printf("str1<str2\n");
return ret;
}
>memchr:
void *memchr(const void *dest,int c,size_t count);
从dest区域所指内存的前count开始查找字符c。
void *my_memchr(const void *dest, int c, int size)
{
assert(dest);
assert(size>0);
while (size&&*(char *)dest){
if (*(char *)dest ==(char)c)
return (char *)dest;
dest = (char *)dest + 1;
size--;
}
return 0;
}
来源:CSDN
作者:九零后的鹏鹏
链接:https://blog.csdn.net/qq_41889292/article/details/80426460