strcpy
char* strcpy(char* dest, const char* src);
strcpy提供了字符串的复制。即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符。
char* my_strcpy(char* dest,char* src)
{
if (src == NULL || dest == NULL)
return NULL;
while(*dest++ = *src++)
{}
return dest;
}
memcpy
void *memcpy( void *dest, const void *src, size_tcount);
memcpy用来拷贝src所指的内存内容前n个字节到dest所指的内存地址上。与strcpy()不同的是,memcpy()会完整的复制n个字节,不会因为遇到’\0’而结束。
void* my_memcpy(void* dst,const void* src,int size)
{
if (dst == NULL || src == NULL)
return NULL;
// 这里之所以创建两个临时变量指针 是为了强制转换成char*
char* d = (char*)dst;
char* s = (char*)src;
while (size--)
{
*d++ = *s++;
}
return dst;
}
例如: char a[10],b[5];
memcpy(b, a, sizeof(b)); //注意如果用sizeof(a),会造成b的内存地址溢出,并且第三个参数是字节数
strcpy和memcpy的区别
1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。
2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符”\0”才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。
3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy
深浅拷贝
浅拷贝:只是增加了一个指针,指向已存在对象的内存(这在某些情况下会导致,对一块空间尝试多次释放,便会出现错误)
深拷贝:是增加了一个指针,并新开辟了一块空间,让指针指向这块新开辟的空间
memcpy和memmove
memcpy和memmove()都是C语言中的库函数,在头文件string.h中,作用是拷贝一定长度的内存的内容,原型分别如下:
void *memcpy(void *dst, const void *src, size_t count);
void *memmove(void *dst, const void *src, size_t count);
他们的作用是一样的,唯一的区别是,当内存发生局部重叠的时候,memmove保证拷贝的结果是正确的,memcpy不保证拷贝的结果的正确。
第一种情况下,拷贝重叠的区域不会出现问题,内容均可以正确的被拷贝。
第二种情况下,问题出现在右边的两个字节,这两个字节的原来的内容首先就被覆盖了,而且没有保存。所以接下来拷贝的时候,拷贝的是已经被覆盖的内容,显然这是有问题的。
实际上,memcpy只是memmove的一个子集。memmove在copy两个有重叠区域的内存时可以保证copy的正确,而memcopy就不行了,但memcopy比memmove的速度要快一些
关于memmove的实现:
void *mymemmove(void *dest, const void *src, size_t n)
{
char temp[n];
int i;
char *d = dest;
const char *s = src;
for (i = 0; i < n; i++)
temp[i] = s[i];
for (i = 0; i < n; i++)
d[i] = temp[i];
return dest;
}