struct s
{
char name[20];
int age;
};
int main()
{
int arr1[] = { 1,2,3,4,5 };
int arr2[5] = { 0 };
struct s arr3[] = { {"张三",20} ,{"李四",18} };
struct s arr4[3];
memcpy(arr4, arr3, sizeof(arr3));
//memcpy(arr2, arr1, sizeof(arr1));
return 0;
}
struct s
{
char name[20];
int age;
};
void* my_memcpy(void* dest, const void* src, size_t num)
{
void* ret = dest;
assert(dest != NULL);
assert(src != NULL);
while (num--)
{
*(char*)dest = *(char*)src;
++(char*)dest;
++(char*)src;
}
return ret;
}
int main()
{
int arr1[] = { 1,2,3,4,5 };
int arr2[5] = { 0 };
struct s arr3[] = { {"张三",20} ,{"李四",18} };
struct s arr4[3];
my_memcpy(arr4, arr3, sizeof(arr3));
//memcpy(arr2, arr1, sizeof(arr1));
return 0;
}
memcpy负责不重叠内容的拷贝,但是在vs编译器下,其可以完成有重叠内容的拷贝,一般来说负责含有重叠部分的拷贝函数为memmove。
memmove的实现思路
#include <stdio.h>
#include <assert.h>
#include <memory.h>
void* my_memmove(void* dest, const void* src, size_t count)
{
assert(dest != NULL);
assert(src != NULL);
void* ret = dest;
if (dest < src)
{
//前->后
while (count--)
{
*(char*)dest = *(char*)src;
++(char*)dest;
++(char*)src;
}
}
else
{
//后->前
while (count--)
{
*((char*)dest + count) = *((char*)src + count);
}
}
return ret;
}
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
//int arr2[] = { 0 };
my_memmove(arr1 + 2, arr1, 20);
return 0;
}
实现思路2
memcmp
memset,是按字节来设置的,一个整型是四个字节,设置的时候要考虑和计算好。注意存储和设置方式,大小端。