+ -
当前位置:首页 → 问答吧 → 看看memcpy与strcpy截然的结果!!为啥?

看看memcpy与strcpy截然的结果!!为啥?

时间:2010-08-11

来源:互联网

首先用: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

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

作者: yyangh   发布时间: 2010-08-11

memcpy(buff1,buff,11);
??这样应该行了吧,少了个字符串结束符

作者: windfail   发布时间: 2010-08-11

memcpy 与 strcpy 的行为是不一样的,后者除了复制内容以外还判断字符串结束的标志,并在目标串里相应的位置添上结束符 '\0'。
既然你想要的结果是第二种,你就应该用 strcpy()。

作者: langue   发布时间: 2010-08-11

本帖最后由 mgqw 于 2010-08-11 22:28 编辑

回复 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够大不越界,得到的结果也会是正确的, 不相信可以去实验下

作者: mgqw   发布时间: 2010-08-11

回复 mgqw

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

Myth.

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

作者: langue   发布时间: 2010-08-11

malloc分配到未用过的确是0,如果是被糟蹋过的,估计就没那么好运气了

作者: bsdc   发布时间: 2010-08-11

回复 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() 分配到的内存,如果未经初始化,那么它的内容是没有任何意义的。这就像定义了变量,假如忘记初始化,那么变量此时的“内容”也不具有意义。

作者: langue   发布时间: 2010-08-11