Chinaunix

标题: memcpy用法 [打印本页]

作者: liumilan2009    时间: 2010-05-12 17:49
标题: memcpy用法
char pass[50] ="Password=abc";
    char Password[50];
    memcpy(Password,&pass[9],50);
    printf("%s",Password);
这样写的话会不会造成什么内存泄露之类的问题?
复制的话从pass的第九位开始复制,上面写了50,
但是实际上没有50个。
这样写安全吗?
作者: bill15    时间: 2010-05-12 17:57
怎么会内存泄露?!内存泄露是你申请内存没释放

这里结果并不是你想要的而已
作者: hellioncu    时间: 2010-05-12 18:07
访问越界
作者: liumilan2009    时间: 2010-05-12 18:08
会越界吗?执行结果就是为abc,我要的东西。
作者: pmerofc    时间: 2010-05-12 18:15
提示: 作者被禁止或删除 内容自动屏蔽
作者: 注册好难哦    时间: 2010-05-12 18:32
memcpy(Password,&pass[9],50);
    printf("%s",Password);

越界,只是你打印的是%s,巧合
作者: ubuntuer    时间: 2010-05-12 23:29
理论上说呢  你这个有问题
实际使用起来因为你的字符串有结尾符 所以没有问题!!!

char a[]="abcd\0efg\0"
和char b[] = "abcd\0"的关系
作者: langue    时间: 2010-05-13 00:23
请记得用 strcpy() 复制字符串,因为 strcpy() 会判断源串的结束标志 '0',也会用 '0' 结束目标串,谢谢。
作者: liumilan2009    时间: 2010-05-13 08:52
那我就直接用strcpy(Password,&pass);
作者: liumilan2009    时间: 2010-05-13 08:53
strcpy(Password,&pass[9]);
作者: darkce    时间: 2010-05-13 09:27
char pass[50] =&quotassword=abc";
    char Password[50];
    memcpy(Password,&pass[9],50);
    print ...
liumilan2009 发表于 2010-05-12 17:49



首先这样在编译,执行的时候可能都很顺利。这样的程序肯定是不稳定的。

当然了printf 出来会是你想要的结果, 因为字符串都以 '\0' 作为结尾标记的

你试下改成这样
char Password[50];
char pass[50] =&quotassword=abc";

    memcpy(Password,&pass[9],50);
    print ...
程序结束

通常这样在程序执行的时候就会出错了。
作者: 1226ehziy    时间: 2010-05-13 10:54
memcpy(Password,&pass[9],50);  
最好不要对这种操作做什么好的假设。
字符串有结束符\0  printf当然会显示出来了,不过printf("%s\n") 应该会更好一些。
作者: suavelee    时间: 2010-05-13 16:54
提示: 作者被禁止或删除 内容自动屏蔽
作者: comesun_cpp    时间: 2010-05-13 23:08
在网上好好搜下memcpy函数的说明
作者: sparkzh    时间: 2010-05-14 13:32
会越界吗?执行结果就是为abc,我要的东西。
liumilan2009 发表于 2010-05-12 18:08



    这个只是凑巧
作者: bluesea666    时间: 2010-05-14 15:58
char pass[50] =&quotassword=abc";
    char Password[50];
    memcpy(Password,&pass[9],50);
    print ...
liumilan2009 发表于 2010-05-12 17:49


strcpy(Password,&pass[9]);
作者: 狗气球    时间: 2010-05-14 17:12
安全一点的话还是strncpy
作者: snnn    时间: 2010-05-14 17:42
写越界了.
作者: kylinhaha    时间: 2010-05-14 18:08
char pass[50] ="Password=abc";
    char Password[50];
    memset(Password,0,sizeof(Password));
    memcpy(Password,pass+8,50);
    printf("%s",Password);
肯定没问题!
作者: 0vk0    时间: 2010-05-15 19:15
char pass[50] ="assword=abc";
    char Password[50];
    memset(Password,0,sizeof(Password));
   ...
kylinhaha 发表于 2010-05-14 18:08



    这个应该没问题了
作者: BMW_325i    时间: 2010-05-24 16:51
memcpy和strcpy各有各的用法的。strcpy常用于字符串的复制!!
作者: Magic_LP    时间: 2010-05-24 20:03
char pass[50] ="assword=abc";
    char Password[50];
    memset(Password,0,sizeof(Password));
   ...
kylinhaha 发表于 2010-05-14 18:08



不解为什么这样就可以肯定一定没问题,虽然你是初始化了Password这片区域,但是还是会读越界,多读了一些数据到Password中。楼主的打印之所以输出abc是因为pass中的'\0'也被复制到Password中,而printf遇到'\0'就结束输出
作者: julysee    时间: 2010-05-24 21:44
越界访问到不可预知的内容。
打印正确只是运气好。如同"abc\0ddd\0",前面的已经说清楚了。
内存泄露是指你malloc动态申请的内存没有free释放掉。所以这里没有内存泄露的问题。
作者: 古兮之    时间: 2010-05-25 12:58
应该没问题的,字符串有结束符
作者: 程序c    时间: 2010-05-29 13:51
领教了,




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2