void* memcpy(void* dest,const void* src,size_t num)
size_t num 拷贝过去内容所占大小—单位是字节
void* —通用类型指针—无类型指针
struct S
{
char name[20];
int age;
};
int main()
{
int arr1[] = { 1,2, 3, 4, 5 };
int arr2[5] = { 0 };
memcpy(arr2, arr1, sizeof(arr1));
struct S arr3[] = { { "张三", 20 }, { "李四", 30 } };
struct S arr4[] = { 0 };
memcpy(arr4, arr3, sizeof(arr3));
return 0;
}
my_memcpy的实现
#include<assert.h>
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;
}
C语言标准规定:
memcpy只要处理不重叠的内存拷贝就可以
memmove处理内存重叠的情况
void* memmove(void* dest,const void* src,size_t count);
dest在src的左边,选择从前往后拷贝,当有交集重合的时候,选择从后往前拷贝,当两者没有任何交集的时候选择从前往后还是从后万前随便。
#include<assert.h>
void* memmove(void* dest, const void* src, size_t num)
{
void* ret = dest;
assert(dest != NULL);
assert(src != NULL);
if (dest < src)
{
//从前向后
while (num--)
{
*(char*)dest = *(char*)src;
(char*)dest+1;
(char*)src+1;
}
}
else
{
//从后向前(你需要先找到dest和src的最后一个字节然后在分别拷贝过去)
while (num--)
{
*((char*)dest + num) = *((char*)src + num);
}
}
return ret;
}
menset
memcmp 这两个最后一个传过去的参数都应该是以字节为单位。这里比较容易出错