关于内存拷贝的问题

baipeng57 2008-11-04 03:18:40
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* memcpy(char* dst, char* src);
void main()
{
char *b,*c;
char *a = NULL;
b="asdfddd";
c = memcpy(a,b);
printf("%s\n",c);
}

char* memcpy(char* dst, char* src)
{
char *a,*b;
a= dst;
b = src;
int s = strlen(b);
dst = (char*)malloc(strlen(b)+1);

while(s--){
//printf("%d",strlen(b));
*a++=*b++;
//printf("%d",strlen(b));
}
//}
return b;
//return NULL;
}

错在哪里,能详细解释一下么??谢谢!!
...全文
187 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
baipeng57 2008-11-05
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 wave820930 的回复:]
引用 8 楼 vk2211 的回复:
dst是参数,却在里面开辟空间,不合适,应该在调用前就分配好空间,memcpy只是复制就好
支持,很重要这个
[/Quote]


如果给你的函数头就是如此呢,参数个数不可以改变,那就必须在函数体内进行开辟空间,有什么好的方法没有???
baipeng57 2008-11-05
  • 打赏
  • 举报
回复
up uP UP UP UP

问题就在strlen这里,没有把‘\0’拷贝进去,所以有错!! 感谢各位啦!
结贴!!
hzc191025 2008-11-05
  • 打赏
  • 举报
回复
char* memcpy(char* dst, char* src);

这个函数的实现和使用都存在问题

实现:
1.memcpy函数只应该负责copy的功能,不应该提供申请内存空间的功能,那么在使用memcpy之前,内存空间就应该申请好了
模块化思想在里面

使用:
2.dst参数在这里没有起到实质性的作用

#include <stdio.h> 
#include <stdlib.h>
#include <string.h>

char* memcpy(char* dst, char* src);
void main()
{
char *b,*c;
char *a = NULL;
b="asdfddd";
c = memcpy(a,b);
printf("%s\n",c);
free(c);
}

char* memcpy(char* dst, char* src)
{
char *a,*b;

b = src;
int s = strlen(b);
dst = (char*)malloc(strlen(b)+1);
a= dst;

while(s--)
{

*a++=*b++;
//printf("%d",strlen(b));
}
//printf("%d\n",dst);

*a = '\0';// 加个这个语句就OK了

return dst;

}

nickshen_qidian 2008-11-05
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>

char* i_memcpy(char* dst, char* src);
void main()
{
char *b,*c;
char *a = NULL;
b="asdfddd";
//a = (char*)malloc(strlen(b)+1); //也可以先给a分配内存
c = i_memcpy(a,b);
printf("%s\n",c);
}

char* i_memcpy(char* dst, char* src)
{
char *a,*b;
int s;
b = src;//给b赋值
s = strlen(b);
if(dst == NULL){//判断dst是否为NULL
dst = (char*)malloc(strlen(b)+1); //dst分配内存
}
assert(dst);
a= dst; //给a赋值应该放在给dst赋值的后面,以确保a不为NULL

while(s--){
*a++=*b++;
}
*a = '\0';//string最后一个字节赋上'\0'
return dst; //返回dst的指针
}
太乙 2008-11-05
  • 打赏
  • 举报
回复
#include <stdio.h> 
#include <stdlib.h>
#include <string.h>

char* memcpy(char* dst, char* src);
void main()
{
char *b,*c;
char *a = NULL;
b="asdfddd";
c = memcpy(a,b);
printf("%s\n",c);
free(c);
}

char* memcpy(char* dst, char* src)
{
char *a,*b;

b = src;
int s = strlen(b);
dst = (char*)malloc(strlen(b)+1);
a= dst;
while(s--){

*a++=*b++;
//printf("%d",strlen(b));
}
//printf("%d\n",dst);
*a='\0';//加上这句!!!!!!!!!!!!!!!
return dst;

}
bbs008 2008-11-05
  • 打赏
  • 举报
回复
如果给你的函数头就是如此呢,参数个数不可以改变,那就必须在函数体内进行开辟空间,有什么好的方法没有???
用二级指针
char* memcpy(char** dst, char* src);
void main()
{
char *b,*c;
char *a = NULL;
b="asdfddd";
c = memcpy(&a,b);
printf("%s\n",c);
free(c);
}

char* memcpy(char** dst, char* src)
{
char *a,*b;

b = src;
int s = strlen(b);
*dst = (char*)malloc(strlen(b)+1);
a= *dst;
while(s--){

*a++=*b++;
//printf("%d",strlen(b));
}
//printf("%d\n",dst);

return *dst;

}
wyswyg63 2008-11-05
  • 打赏
  • 举报
回复
while(s--){

*a++=*b++;
//printf("%d",strlen(b));
}
这里不对吧,strlen返回字符串长度,不包括'\0',你这样写'\0'没有复制进去
应该是:s+=1; while(s--){};
bitmap8 2008-11-04
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 xmczr 的回复:]
这个函数设计理念有点问题,在函数内部也未作任何判断处理,嗯,需要改进的地方还挺多的.
[/Quote]

up
huang_dy 2008-11-04
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 vk2211 的回复:]
dst是参数,却在里面开辟空间,不合适,应该在调用前就分配好空间,memcpy只是复制就好
[/Quote]支持,很重要这个
xmczr 2008-11-04
  • 打赏
  • 举报
回复
这个函数设计理念有点问题,在函数内部也未作任何判断处理,嗯,需要改进的地方还挺多的.
baipeng57 2008-11-04
  • 打赏
  • 举报
回复
谢谢楼上各位的解释,但是修改过上述问题后,还是不正确,修改后为:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* memcpy(char* dst, char* src);
void main()
{
char *b,*c;
char *a = NULL;
b="asdfddd";
c = memcpy(a,b);
printf("%s\n",c);
free(c);
}

char* memcpy(char* dst, char* src)
{
char *a,*b;

b = src;
int s = strlen(b);
dst = (char*)malloc(strlen(b)+1);
a= dst;
while(s--){

*a++=*b++;
//printf("%d",strlen(b));
}
//printf("%d\n",dst);

return dst;

}
pingmail 2008-11-04
  • 打赏
  • 举报
回复
char* memcpy(char* dst, const char* src)
这样申明比较好.
yuhudie203 2008-11-04
  • 打赏
  • 举报
回复
return b改为return dst

b用数组,字符串常量不可修改
vk2211 2008-11-04
  • 打赏
  • 举报
回复
a= dst;
dst = (char*)malloc(strlen(b)+1);
这样操作后,a是以前的dst,也就是main里的a,就是NULL,但dst已经变了
应该这两句交换一下
另外,返回应该是a
但是还是好。dst是参数,却在里面开辟空间,不合适,应该在调用前就分配好空间,memcpy只是复制就好
cyj626 2008-11-04
  • 打赏
  • 举报
回复
总觉得怪怪的,应该还有问题
  • 打赏
  • 举报
回复
楼上的正确,
还应该在main()的最后加上free(c)
cyj626 2008-11-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 xhs_lh04 的回复:]
你的memcpy函数是将源串拷贝到目标串
char *a,*b;
a= dst;
b = src;
int s = strlen(b);
dst = (char*)malloc(strlen(b)+1);
这里不对了
开始是a指向的是未分配空间前的指针dst,=NULL
后来dst指针新分配的空间而a还是NULL

应该:
dst = (char*)malloc(strlen(b)+1);
a= dst;
[/Quote]
up
wiler 2008-11-04
  • 打赏
  • 举报
回复
return b;
改为:
return dst;//-- 因为dst 在函数里保存的是申请到的内存的首地址,而b指向的是源串地址
xhs_lh04 2008-11-04
  • 打赏
  • 举报
回复
另外你返回应该是目标串的地址,而不是b,b是源串的
xhs_lh04 2008-11-04
  • 打赏
  • 举报
回复
你的memcpy函数是将源串拷贝到目标串
char *a,*b;
a= dst;
b = src;
int s = strlen(b);
dst = (char*)malloc(strlen(b)+1);
这里不对了
开始是a指向的是未分配空间前的指针dst,=NULL
后来dst指针新分配的空间而a还是NULL

应该:
dst = (char*)malloc(strlen(b)+1);
a= dst;

加载更多回复(1)

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧