免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3495 | 回复: 11
打印 上一主题 下一主题

看看memcpy与strcpy截然的结果!!为啥? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-08-11 21:52 |只看该作者 |倒序浏览
首先用:memcpy(buff1,buff,10);
printf("%s \n",buff1结果):

0123456789ljasdljwoinwq,knsiouwoeirwobnka


同样的代码,将这个地方改成:strcpy(buff1,buff);
printf("%s \n",buff1结果):
0123456789

第二个结果是我要的结果,但是同样的东西为什么会这样。

后来我找了好久,在另一个函数(完全不相关的函数)注释了这样一句代码:
char * filebuff = (char *) malloc (52428800 * sizeof(char));
然后就两个结果都一样了,都是:
0123456789

这是奇怪啊,为什么会有这样的事发生呢?

论坛徽章:
0
2 [报告]
发表于 2010-08-11 22:08 |只看该作者
memcpy(buff1,buff,11);
??这样应该行了吧,少了个字符串结束符

论坛徽章:
0
3 [报告]
发表于 2010-08-11 22:25 |只看该作者
memcpy 与 strcpy 的行为是不一样的,后者除了复制内容以外还判断字符串结束的标志,并在目标串里相应的位置添上结束符 '\0'。
既然你想要的结果是第二种,你就应该用 strcpy()。

论坛徽章:
0
4 [报告]
发表于 2010-08-11 22:27 |只看该作者
本帖最后由 mgqw 于 2010-08-11 22:28 编辑

回复 1# yyangh


    首先用:memcpy(buff1,buff,10);
printf("%s \n",buff1结果):

0123456789ljasdljwoinwq,knsiouwoeirwobnka

首先用:memcpy(buff1,buff,10);
printf("%s \n",buff1结果):

0123456789ljasdljwoinwq,knsiouwoeirwobnka

自己去掰手指头数数从0-9有几个数, memcpy是不会在末尾加字符串结束符的。


同样的代码,将这个地方改成:strcpy(buff1,buff);
printf("%s \n",buff1结果):
0123456789

第二个结果是我要的结果,但是同样的东西为什么会这样。

strcpy对了, 因为这个函数会默认给字符串末尾加结束符, 当然益出的情况在此不考虑。

后来我找了好久,在另一个函数(完全不相关的函数)注释了这样一句代码:
char * filebuff = (char *) malloc (52428800 * sizeof(char));
然后就两个结果都一样了,都是:
0123456789

这是奇怪啊,为什么会有这样的事发生呢?


那是因为malloc申请内存空间, 默认全部都是'\0', 也就是字符串结束符, 所以看起来都一样。
第一个问题如果你先memset( buff1, 0, sizeof(buff1) )  只要buff1够大不越界,得到的结果也会是正确的, 不相信可以去实验下

论坛徽章:
0
5 [报告]
发表于 2010-08-11 22:36 |只看该作者
回复 4# mgqw

>> 那是因为malloc申请内存空间, 默认全部都是'\0', 也就是字符串结束符, 所以看起来都一样。

Myth.

真实的情况是,如果需要 zero-initialized memory,请使用 calloc()。

论坛徽章:
0
6 [报告]
发表于 2010-08-11 22:52 |只看该作者
malloc分配到未用过的确是0,如果是被糟蹋过的,估计就没那么好运气了

论坛徽章:
0
7 [报告]
发表于 2010-08-11 23:15 |只看该作者
回复 6# bsdc

>> malloc分配到未用过的确是0

C 标准和 manual section 3 都找不到这样的陈述。
我认为在这里使用“的确”两个字就让这句话完全成为了臆断。

malloc(3):

       calloc()  allocates memory for an array of nmemb elements of size bytes
       each and returns a pointer to the allocated memory.  The memory is  set
       to  zero.  If nmemb or size is 0, then calloc() returns either NULL, or
       a unique pointer value that can later be successfully passed to free().

       malloc()  allocates  size  bytes and returns a pointer to the allocated
       memory.  The memory is not  cleared.   If  size  is  0,  then  malloc()
       returns  either  NULL, or a unique pointer value that can later be suc-
       cessfully passed to free().


真实的情况是,malloc() 分配到的内存,如果未经初始化,那么它的内容是没有任何意义的。这就像定义了变量,假如忘记初始化,那么变量此时的“内容”也不具有意义。

论坛徽章:
0
8 [报告]
发表于 2010-08-12 08:37 |只看该作者
回复 7# langue


    同意lang的观点,malloc是在heap上分配的,但并不会自动初始化,除非人为初始化,否则应该是不确定的

论坛徽章:
0
9 [报告]
发表于 2010-08-12 09:03 |只看该作者
要0那就calloc

要么就手动memset,不过没啥必要,坛子里的高手都觉得memcpy+memset是相当菜的表现,只不过我觉得这样用倒是没有关系

论坛徽章:
0
10 [报告]
发表于 2010-08-12 09:09 |只看该作者
不妨换个思路,如果是用memcpy,就不要假定自己操作的是c字符串,看成数组好了。
printf("%.*s \n", 10, buff1结果): 明确告诉printf自己要打印的字符个数。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP