memcpy复制字符串的注意事项/memcpy不能用来拷贝类类型

strcpy复制src到dst,最后将dst的下一个位置置为'\0',所以dst是以'\0'结尾的字符串

char c1[10] = "abcde";
cout << c1 << endl;
char *s = c1;
char*end = &c1[9];
printf("%d\n", strlen(c1));// strlen不包括结尾的'\0'长度
printf("%d\n", sizeof(c1));//10个字节
while (s != end)
{
    cout <<int( *s++) << " ";
        
}
char c2[10];//c2的元素默认初始化,值未知
for (auto x : c2)
{
    cout << int(x) << endl;//转换为int输出
        
}
3 strcpy(c2, c1);    //memcpy(c2, c1,strlen(c1));
4 for (auto x : c2)
5 {
6     cout <<int( x )<< endl;//转换为int输出
7     
8 }
9 cout << strlen(c2) << endl;

但是用memcpy是按字节拷贝,第三个参数不大于strlen(c1)长度,就不会拷贝空字符到尾部,下面这段代码只拷贝了abcde, '\0'不会被拷贝,strlen(c2)会求出一个错误的长度

char c1[10] = "abcde";
char c2[10];//c2的元素默认初始化,值未知
/*strcpy(c2, c1);*/
memcpy(c2, c1,strlen(c1));
for (auto x : c2)
{
    cout <<int( x )<< endl;//转换为int输出
        
}
cout << strlen(c2) << endl;

正确的拷贝做法是 memcpy(c2,c1,strlen(c1)+1)

memcpy的拷贝方式是void*dst和void*src都转换为char*类型的指针,按字节拷贝

memcpy可以用于int,char,struct,数组的拷贝,可以拷贝string类型吗?

1 int a[10] = { 1, 2, 3, 4, 5, 5, 7, 8, 9, 0 };
2 int *ap = new int[10];
3 memcpy(ap, a, sizeof(a)*sizeof(int));
4 int *endp = ap + 10;
5 while (ap != endp)
6 {
7     cout << *ap++ << " ";
8 
9 }

拷贝结构体

 1 struct {
 2     char name[40];
 3     int age;
 4 } person, person_copy;
 5 
 6 int main()
 7 {
 8     char myname[] = "Pierre de Fermat";
 9 
10     /* using memcpy to copy string: */
11     memcpy(person.name, myname, strlen(myname) + 1);
12     person.age = 46;
13 
14     /* using memcpy to copy structure: */
15     memcpy(&person_copy, &person, sizeof(person));
16 
17     printf("person_copy: %s, %d \n", person_copy.name, person_copy.age);
18 
19     return 0;
20 }

不能拷贝string类型,sizeof(string)只是求了固定大小的成员的内存和,而没有求string内部指针指向的存字符的那一段内存

如果结构体含有指针,指向某段内存,memcpy的拷贝也会失败

https://www.2cto.com/kf/201111/110916.html   http://blog.csdn.net/qq_21550341/article/details/51636366

 

posted @ 2017-09-30 17:14  hchacha  阅读(13501)  评论(0编辑  收藏  举报