目录
memcpy
memmove
memcmp
memcpy
void *memcpy(void *str1, const void *str2, size_t n)
memcpy内存拷贝函数,size_t n 是表示的字节数,返回的是目标空间的首地址
模拟实现memcpy
void* my_memcpy(void* dest, const void*src, size_t count)
{
void* ret = dest;
assert(dest && src);
while (count--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
int main()
{
int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[20] = { 0 };
//拷贝的是整型数据
my_memcpy(arr2, arr1, 10*sizeof(int));//第三个参数是多少个字节
int i = 0;
for (i = 0; i < 20; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
memmove
void *memmove(void *str1, const void *str2, size_t n)
memmove也是内存拷贝,但是它可以实现重叠部分的拷贝。
模拟实现memmove
void* my_memmove(void* dest, const void* src, size_t count)
{
void* ret = dest;
if (dest < src)
{
//前->后
while (count--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else
{
//后->前
while (count--)
{
*((char*)dest + count) = *((char*)src + count);
}
}
return ret;
}
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// 1,2,1,2,3,4,7,8,9,10
//memcpy(arr+2, arr, 16);
//memcpy - 只要完成了不重叠的内存拷贝就完成任务
my_memmove(arr + 2, arr, 16);
my_memmove(arr, arr+2, 16);
//内存拷贝时,出现内存重叠的现象,应该使用memmove
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
memcmp
int memcmp(const void *str1, const void *str2, size_t n)
memcmp内存比较函数
- 如果返回值 < 0,则表示 str1 小于 str2。
- 如果返回值 > 0,则表示 str1 大于 str2。
- 如果返回值 = 0,则表示 str1 等于 str2。
int main()
{
int arr1[] = { 1, 2, 3, 4, 5 };
int arr2[] = { 1, 2, 3, 6, 6 };
int ret=memcmp(arr1, arr2, 12);
printf("%d\n", ret);
return 0;
}
|