memcpy使用和模拟实现
strcpy是对字符串进行拷贝的函数,而memcpy是针对内存块进行拷贝的函数
void * memcpy(void * destination , const void * source , size_t num);
num是字节数
关于memcpy的使用:
1.函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。
2.这个函数在遇到'\0‘时不会停下来。
3.如果source和destination有任何的重叠,复制的结果都是未定义的。
模拟实现
#include <stdio.h>
#include <string.h>
#include <assert.h>
void* my_memcpy(void * dest,void * src,size_t num)
{
void* ret = dest;
int i = 0;
assert(dest && src);
while (num--)
{
*(char*)dest = *(char*)src;
src = (char*)src + 1;//((char*)src)++;
dest = (char*)dest + 1;//((char*)dest)++;
}
return ret;
}
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[20] = { 0 };
my_memcpy(arr2, arr1, 20);
int i = 0;
for (i = 0; i < 20; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
运行结果与上方相同。
memmove使用和模拟实现
void * memmove (void * destination , const void * source , size_t num);
memmove的使用
和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
如果原空间的目标空间出现重叠,就得使用memove函数处理。
memmove函数拷贝完成后,会返回目标空间的起始地址。
memmove函数的模拟
当dest>=scr时,应该选择从后向前;
当dest<scr时,应该选择从前向后;
#include <stdio.h>
#include <string.h>
#include <assert.h>
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;
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
memmove(arr + 2, arr, 5 * sizeof(int));
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
memset函数的使用
void * memset(void * ptr , int value , size_t num);
以字节为单位设置value
memcmp函数的使用
int memcmp(const void * ptr1, const void * ptr2 , size_t num );