1.memcpy
1.1简述:
void * memcpy ( void * destination, const void * source, size_t num );
函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
这个函数在遇到 '\0' 的时候并不会停下来。
如果source和destination有任何的重叠,复制的结果都是未定义的。
1.2代码模拟实现:
#include<stdio.h> #include<String.h> #include<assert.h> void *my_memcpy(void* dest, const void* src, int count) { assert(dest && src); void* p = dest; while (count--)//每个字节依次复制 { *((char*)dest)++ = *((char*)src)++; } return p; } int main() { int arr1[5] = { 1,2,3,4,5 }; int arr2[20] = { 0 }; (char*)my_memcpy(arr2, arr1, 8); for (int i = 0; i < sizeof(arr2) / sizeof(int); i++) { printf("%d ", arr2[i]); } return 0; }
2.memmove
1.1简述
void * memmove ( void * destination, const void * source, size_t num );
和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
如果源空间和目标空间出现重叠,就得使用memmove函数处理。
1.2代码模拟实现:
#include<stdio.h> #include<string.h> #include<assert.h> void* my_memmove(void* dest,const void* src, int count) { assert(dest != NULL); assert(src != NULL); char* p = dest; if (src>dest)//从前向后复制 { while (count--) { *(char*)dest = *(char*)src; ((char*)dest)++; ((char*)src)++; } } else { (char*)dest += (count-1); (char*)src += (count-1); while (count--) { *((char*)dest)-- = * ((char*)src)--; //这里跟上面的++其实一样,只不过用了一种简化的方法,可以仔细看一下 } } return p; } int main() { char arr[] = "abcdefgh"; printf("%s\n", (char*)my_memmove(arr + 1, arr + 3, 4)); printf("%s", arr); return 0; }
3.memcmp
3.1简述
int memcmp ( const void * ptr1, const void * ptr2, size_t num );
比较从ptr1和ptr2指针开始的num个字节
3.2代码模拟实现:
#include<stdio.h> #include<string.h> #include<assert.h> int my_memcmp(void* ptr1, void* ptr2, int num) { assert(ptr1 && ptr2); while (*(unsigned char*)ptr1 == *(unsigned char*)ptr2 && (char*)ptr1 && (char*)ptr2&&num!=0) { ((char*)ptr1)++; ((char*)ptr2)++; num--; } if (num==0) { return 0; } else if(*(unsigned char*)ptr1>*(unsigned char*)ptr2||(char*)ptr2=='\0') { return 1; } else { return -1; } } int main() { char arr1[] = "hello"; char arr2[] = "heee"; int a= my_memcmp(arr1, arr2,2); printf("%d\n", a); return 0; }