找回密码
 注册
搜索
查看: 2157|回复: 5

[讨论] 内存拷贝问题!

[复制链接]
发表于 2012-3-23 20:55:32 | 显示全部楼层 |阅读模式
面试过程中总会被问到不是很难但是却又做不好的题目。,下面是一个内存拷贝,自己回来写下来,但运行总是不大对劲,还请高手指教!感谢!

char *strpy(char *dst,char *src)
{
        char *addr = dst;

        assert(src);
        assert(dst);
        while((*dst++ = *src++)! = '\0');
        addr = dst;
        return addr;
}

int  main(void)
{
  char *d = (char *)malloc(10);
  char *c;

  assert(d);
  c = strpy(d,"hello");
  free(d);
  d = NULL;
  return 1;

}

[此贴子已经被作者于2012-3-24 10:10:36编辑过]
发表于 2012-3-29 09:31:55 | 显示全部楼层
2楼 3楼 不懂胡扯
4楼靠谱
正常的 strcpy 返回值为dst 原始值,为了链式表达式使用。你这里返回的是
dst+strlen(src)的值了
malloc 分配内存后最好清空一下,作用大家都知道。
点评回复

使用道具 举报

发表于 2012-3-27 19:35:00 | 显示全部楼层
这个内存拷贝应该有一些细节问题需要注意:
首先申请了10字节的堆,然后通过strpy函数把hello拷贝到堆中(首地址为d),需要注意的是strpy函数,返回的是d+sizeof("hello"),也就是c=d+6,然后通过free(d)释放堆空间,特别需要注意的是free函数,其参数是void *p,所以free(d)释放的不仅仅是d~d+5的空间哦,释放的应该是申请的10个字节空间,所以c变成了一个被剥夺了“居所”的野指针,这时候应该把c=NULLL。
点评回复

使用道具 举报

发表于 2012-3-26 11:18:40 | 显示全部楼层
char *strpy(char *dst,char *src)
{
char *addr = dst;

assert(src);
assert(dst);
while((*dst++ = *src++)! = \'\\0\');
addr = dst;
return addr;
}
这里写的不对,应该是,去掉;要不然循环走不到.
while((*dst++ = *src++)! = \'\\0\')
{
addr = dst;
}
点评回复

使用道具 举报

发表于 2012-3-24 18:51:03 | 显示全部楼层
free(d);
  d = NULL;
这个不对。

就算你拷贝完立即释放也要是free c.
d这个时候已经不是之前的d了
点评回复

使用道具 举报

发表于 2012-3-30 17:50:58 | 显示全部楼层
学习了![em01]
点评回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

Archiver|手机版|小黑屋|52RD我爱研发网 ( 沪ICP备2022007804号-2 )

GMT+8, 2024-11-23 12:28 , Processed in 0.057866 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表