[Error] lvalue required as increment operand
可以将源文件.cpp 改为 .c文件
memcpy
void* memcpy(char* dest, const void* src , size_t num);
memcpy从src指向的位置开始,拷贝num个字节到dest指向的位置,
当src指向的内容为'\0'时,拷贝也不会停止。
当遇到重叠拷贝时,库memcpy函数也会拷贝成功,my_memcpy则不会。
void* 无类型指针,可以存放任何类型的地址,但不能进行解引用操作 和 加减整数操作,,,通过指针名,指针名是地址,可以比大小
#include<stdio.h>
#include<string.h>
#include<assert.h>
// size_t(单位字节) == __MINGW_EXTENSION typedef unsigned __int64 size_t;
void* my_memcpy(void* dest, const void* src, size_t num){
assert(dest != NULL);//断言
assert(src != NULL);
void* ret = dest;
while(num--){ // num个字节
*(char*)dest = *(char*)src;
// ++(char*)dest; 后缀++的优先级比强制类型转换高
// ++(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret; //返回起始位置
}
int main(){
int arr1[] = {1,2,3,4,5,6,7,8,9,10};
int arr2[10] = {0};;
my_memcpy(arr2,arr1,sizeof(arr1));
int i=0;
for(i=0;i<10;i++){
printf("%d ",arr2[i]); // 1 2 3 4 5 6 7 8 9 10
}
// int arr3[] = {1,2,3,4,5,6,7,8,9,10};
// 不能处理重叠的数据,库里的memcpy可以实现重叠部分;
// my_memcpy(arr3+2,arr3,20);
// memcpy == memmove
// int i=0;
// for(i=0;i<10;i++){
// printf("%d ",arr3[i]);
// }
return 0;
}
//结构体的拷贝
struct S{
char name[20];
int age;
};
int main(){
struct S s1[3] = { {"张三",20}, {"李四",30}, {"小猪",100} };
struct S s2[4] = {0};
my_memcpy(s2,s1,sizeof(s1));
return 0;
}