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