>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; }