void memcpy(const char* src,char* dest){ int len=strlen(src); dest=(char*)malloc(len); char* d=dest; char* s=src; while(len--!=0){ *d=*s; d++; s++; } }
char* memcpy(const char* src,char* dest){ if(*src==NULL) { return NULL; } char *temp=dest; while(*src!='\0') { *dest=*src; src++; dest++; } *dest='\0'; return temp; }
void *memcpy(void *dst, const void *src, size_t len) { if(NULL == dst || NULL == src){ return NULL; } void *ret = dst; if(dst <= src || (char *)dst >= (char *)src + len){ //没有内存重叠,从低地址开始复制 while(len--){ *(char *)dst = *(char *)src; dst = (char *)dst + 1; src = (char *)src + 1; } }else{ //有内存重叠,从高地址开始复制 src = (char *)src + len - 1; dst = (char *)dst + len - 1; while(len--){ *(char *)dst = *(char *)src; dst = (char *)dst - 1; src = (char *)src - 1; } } return ret; }
void memcpy(const char* src,char *&dest) { int len=strlen(src); dest=(char*)malloc(++len); char* d=dest; const char* s=src; while(len--!=0) *d++ = *s++; }
代码主要有3个逻辑错误以及一个设计上的错误: 这个设计错误,得分两种情况来讨论(好比标准库中strcpy函数和memcpy函数): 1、对于src来说,若它包含'\0'字符,在memcpy参数中可以不提供src的长度,在函数中可以通过strlen函数来取得src的长度; 2、若src中不包含'\0'字符,则必须在memcpy参数中提供src长度参数,即函数外面提供,否则,将不可能知道src的长度,拷贝也是不可能的。 对于第1种情况,有几点需要注意: 1)计算src长度时,必须加上src的‘\0’字符,即int len = strlen(src)+1; 2)在拷贝时,目的dest的结尾必须加上 ‘\0’字符; 3)这个错误两种情况下都有问题,错误是在函数内部动态分配空间这个问题,参数dest必须定义为char **dest,如果传递的参数定义为*dest,等于就是函数传值啦,在函数中对dest的改变,将不会影响实参,所以这个问题也需要注意。 总结:其实标准库中strcpy函数和memcpy函数的参数dest都不会在函数体中动态分配空间,是在外部分配的。
void memcpy(const char* src,char* dest){ int len=strlen(src);//要考虑'\0'结束符,len需要再加1 dest=(char*)malloc(len);//不能在函数内分配内存,这里得到的是局部变量指针 char* d=dest; char* s=src;//src是const指针,赋值错误 while(len--!=0){ *d=*s; d++; s++; } }
void memcpy(const char* src, char* dest){ int len = strlen(src)+1; //dest = (char*)malloc(len+1); char* d = dest; const char* s = src; while (len-- != 0){ *d = *s; d++; s++; } }