首先,我们之前学习过strcpy函数(字符拷贝函数),不过这个函数有缺陷;如果用这个strcpy函数去拷贝整形数组有两个问题:1.拷贝的类型不一样strcpy(char* ,const char*);2.字符拷贝函数遇到'\0'就停止了,如果数组中以小端存储(01 00 00 00),则拷贝到00就停止了。
memcpy函数:
memcpy函数是以拷贝内存块来实现的,无论什么类型的数据都能拷贝,在C语言的库函数中memcpy函数的定义如下:void * memcpy( void * dest,const void * src, size_t num(单位是字节))。memcpy函数应该用于拷贝不重叠的内存,而memmove函数可以处理内存重叠的情况。
为什么会想到强制类型转换为char* 类型?
是因为size_t num 的单位是字节,而char* 类型移动的距离也是一个字节。
接下来,让我们自己实现my_memcpy函数。
void* memcpy(void* dest, const void* src, size_t num){ assert(dest && src); void* ret = dest; while(num--){ *(char* )dest = *(char* )src; dest = (char* )dest + 1; src = (char* )src + 1; } return ret; }
这个自写函数只能拷贝不重叠的部分,而库函数中的memcpy也能拷贝重叠的部分。
memmove函数
memmove函数可以处理内存重叠的情况,在实现my_memmove函数中的思路是:可以将源数据从前向后拷贝,或从后向前拷贝。如果源头地址大于目标地址,则从前向后拷贝;源头地址+num小于目标地址,则从后向前拷贝。
void* my_memmove(void* dest,const void* src,size_t num){ assert(dest && src); void* ret = dest; if(dest < src){ while(num--){ *(char* )dest = *(char* )src; dest = (char* )dest + 1; src = (char* )src + 1; } } else{ while(num--){ *((char* )dest + num) = *((char* )src + num); } } return ret; }
memcmp函数
C语言中的库函数是:int memcmp(const void* ptr1,const void* ptr2,size_t num)。如果比较浮点型,要注意浮点型储存。
memset函数
C语言中的库函数是:void* memset(void* ptr,int value,size_t num)。将内存中的内容数字改成value。特点是以字节为单位设置内存。