首页 > 试题广场 >

请找出下面用于拷贝内存的代码中的逻辑错误,并修正。

[问答题]
请找出下面用于拷贝内存的代码中的逻辑错误,并修正。
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++;
    }
}

推荐
答案:
主要两个问题,一是没有为字符串结束符‘\0’申请空间,一是没有拷贝结束符。
代码如下
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’;
}

编辑于 2015-01-30 11:03:59 回复(5)
void memcpy(const char* src,char* dest){
    int len=strlen(src)+1;
    //dest=(char*)malloc(len);
    char* d=dest;
    const char* s=src;
    while(len--!=0){
        *d=*s;
        d++;
        s++;
    }
    *d ='\0';
}
发表于 2015-08-06 16:23:39 回复(0)
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;	
}

发表于 2016-03-22 16:01:00 回复(0)
根据题目的说明来看,src不一定是字符串,所以也不会有结束0。
  1. src不能通过strlen判断长度 
  2. dest新申请空间没有意义。 应由外部传入。
  3. len == 0时,len--!=0会变成对负数的判断,导致死循环。 
  4. 如果dst和src有重复的部分则会出错。
编辑于 2015-08-15 19:43:40 回复(3)
voidmemcpy(constchar* src,char* dest){
    int len=strlen(src);
    char* d=dest;
    char* s=src;
    while(len--!=0){
        *d=*s;
        d++;
        s++;
    }
}
发表于 2018-09-13 11:32:32 回复(0)
void memcpy(const char* src, char* dest){
    int len = strlen(src);
    while (len--){
        *dest = *src;
        dest++;
        src++;
    }
    dest[len] = '\0';
}

发表于 2017-03-24 19:56:06 回复(0)
这道题还有个问题,虽然子程序中为dest指针分配了空间,但是这个dest形参并不会对调用它的程序所传递给它的参数做出改变。
即:
    char *src = "hello";
    char *dst = "world";
    memcpy(src, dst);
这三条指令执行后,dst指针所指向的字符串仍旧是"world".
    应该把memcpy写为 memcpy(const char *src, char ** dest)
或者说,不能再memcpy函数中进行malloc分配。

发表于 2016-03-18 22:45:42 回复(0)
1、因为输入的目的指针并不是二级指针,所以内部分配的动态内存是无法用dest指针回传的。因此,dest一定是外部分配好的内存,不需要自己分配
2、虽然函数名的意思是内存拷贝,但没有输入长度参数,所以只能是拷贝字符串。需要在最后位置添加‘\0’.(原题是对的)
3、另外,需不需要检查空指针。这也是一个问题。
编辑于 2016-03-18 09:56:33 回复(0)
dest=(char*)malloc(len);改为
dest=(char*)malloc(len+1);
循环结束后加上
*d='\0';
发表于 2015-10-05 10:45:39 回复(0)
char* s=src;这里还有错误
char* 和const char *
cannot convert from 'const char *' to 'char *'
发表于 2015-09-15 17:11:27 回复(0)
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;
}

发表于 2015-09-14 11:38:49 回复(0)
<div style="color:#333333;"> <div id="highlighter_831106" class="syntaxhighlighter java" style="margin:1em 0px !important;"> <table border="0" cellpadding="0" cellspacing="0" style="border:0px !important;height:auto !important;margin:0px !important;padding:0px !important;background:none !important;"> <tbody> <tr> <td style="border:0px !important;vertical-align:baseline !important;background:none !important;"> <div class="container" style="margin:0px !important;padding:0px !important;vertical-align:baseline !important;"> <div class="line number1 index0 alt2" style="margin:0px !important;padding:0px 1em !important;vertical-align:baseline !important;"> voidmemcpy(constchar* src,char* dest){ </div> <div class="line number2 index1 alt1" style="margin:0px !important;padding:0px 1em !important;vertical-align:baseline !important;"> &nbsp;&nbsp;&nbsp;&nbsp;intlen=strlen(src); </div> <div class="line number3 index2 alt2" style="margin:0px !important;padding:0px 1em !important;vertical-align:baseline !important;"> &nbsp;&nbsp;&nbsp;&nbsp;dest=(char*)malloc(len + 1); </div> <div class="line number4 index3 alt1" style="margin:0px !important;padding:0px 1em !important;vertical-align:baseline !important;"> &nbsp;&nbsp;&nbsp;&nbsp;char* d=dest; </div> <div class="line number5 index4 alt2" style="margin:0px !important;padding:0px 1em !important;vertical-align:baseline !important;"> &nbsp;&nbsp;&nbsp;&nbsp;char* s=src; </div> <div class="line number6 index5 alt1" style="margin:0px !important;padding:0px 1em !important;vertical-align:baseline !important;"> &nbsp;&nbsp;&nbsp;&nbsp;while(len--!=0){ </div> <div class="line number7 index6 alt2" style="margin:0px !important;padding:0px 1em !important;vertical-align:baseline !important;"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*d=*s; </div> <div class="line number8 index7 alt1" style="margin:0px !important;padding:0px 1em !important;vertical-align:baseline !important;"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d++; </div> <div class="line number9 index8 alt2" style="margin:0px !important;padding:0px 1em !important;vertical-align:baseline !important;"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s++; </div> <div class="line number10 index9 alt1" style="margin:0px !important;padding:0px 1em !important;vertical-align:baseline !important;"> &nbsp;&nbsp;&nbsp;&nbsp;} </div> <div class="line number10 index9 alt1" style="margin:0px !important;padding:0px 1em !important;vertical-align:baseline !important;"> &nbsp; &nbsp; *d = '\0'; </div> <div class="line number11 index10 alt2" style="margin:0px !important;padding:0px 1em !important;vertical-align:baseline !important;"> } </div> <div> <br /> </div> </div> </td> </tr> </tbody> </table> </div> </div>
发表于 2015-09-09 20:49:49 回复(0)
四个错误。
1、第二个形参应改为 char *&dest,否则无返回值
2、局部变量s应改为const char*类型,否则此赋值语句无效
3、malloc申请内存应为 len+1
4、应加结束符'\0'
修改后的代码如下
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++;           
}

发表于 2015-09-06 16:38:42 回复(0)
代码主要有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都不会在函数体中动态分配空间,是在外部分配的。  

发表于 2015-09-02 17:17:08 回复(0)
  1. 刚刚编译了下代码,发现错误如下:1)调用strlen函数时要包涵头文件string.h,而头文件已定义memcpy函数,会出现错误:error: conflicting types for ‘memcpy’,所以此刻需要改函数名为mymemcpy(自定义函数名);2)这里用malloc函数申请了动态内存,而动态内存是无法由该函数传递的,即动态分配内存应在主函数main中申请,另外分配内存的大小应该是strlen(str)+ 1,考虑结束符'\0';3)申明char* s时要与const char* src类型一致,不然会弹出警告,即const char* s;4)结束符'\0'未进行拷贝...(上面的表述可能也有错的,而且表达不够专业,求指点...)
具体修改如下:
void mymemcpy(const char* src,char* dest){   
        int len = strlen(src)+1;
        char* d = dest; 
        const char* s = src;    
        while(len--!=0)
        {            
                *d=*s;    
                d++;      
                s++;      
        }   
        *d='\0';
}



发表于 2015-03-21 10:43:10 回复(1)
void memcpy(const char* src,char* dest){
    int len=strlen(src) + 1;
    char* d=dest;
    char* s=src;
    while(len--!=0){
        *d=*s;
        d++;
        s++;
    }
}

发表于 2015-01-21 15:55:27 回复(0)
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++;
	}
}

发表于 2015-01-13 10:11:39 回复(1)