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++;
}
}
void memcpy(const char* src,char* dest){ int len=strlen(src); dest=(char*)malloc(len+1); char* d=dest; char* s=src; while(len--!=0) { *d=*s; d++; s++; } *d=’\0’; }