看看memcpy与strcpy截然的结果!!为啥?
时间:2010-08-11
来源:互联网
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
??这样应该行了吧,少了个字符串结束符
作者: windfail 发布时间: 2010-08-11
既然你想要的结果是第二种,你就应该用 strcpy()。
作者: langue 发布时间: 2010-08-11
回复 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
>> 那是因为malloc申请内存空间, 默认全部都是'\0', 也就是字符串结束符, 所以看起来都一样。
Myth.
真实的情况是,如果需要 zero-initialized memory,请使用 calloc()。
作者: langue 发布时间: 2010-08-11
作者: bsdc 发布时间: 2010-08-11
>> 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
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28