一.memcpy与strcpy
strcpy和memcpy主要有以下3方面的区别。
1.复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。
2.复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,如果空间不够,就会引起内存溢出。memcpy则是根据其第3个参数决定复制的长度。
3.用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy,由于字符串是以“\0”结尾的,所以对于在数据中包含“\0”的数据只能用memcpy。
#include<string>
#include<iostream>
using namespace std;
//strlen strcpy memcpy
struct tag_stu
{
char number;
char name;
};
//memcpy 不会补充\0,告诉他拷贝几个字节,他就拷贝几个字节
//strcpy 会拷贝\0
int main()
{
//先来测试下memcpy
struct tag_stu test = {'h','z'};
char *p = new char[3];
memset(p, 0, strlen(p) + 1);
memcpy(p,&test,sizeof(test));
cout << p <<strlen(p)<< endl;
char *src = "zhang";
cout << strlen(src) << endl;
char *dst = new char[strlen(src) + 1];
dst[5] = 'i';//为了验证strcpy会复制\0过来
strcpy(dst, src);
cout << dst << endl;
return 0;
}
输出如下所示:
hz2
5
zhang
二.memcpy与memmove
void *memcpy(void *dst, const void *src, size_t count);
void *memmove(void *dst, const void *src, size_t count);
他们的作用是一样的,唯一的区别是,当内存发生局部重叠的时候,memmove保证拷贝的结果是正确的,memcpy不保证拷贝的结果的正确。