一、memcpy三个函数在使用过程中,均需包含以下头文件:
//在C中
#include <string.h>
//在C++中
#include <cstring>
二、memcpy函数是C/C++中的内存拷贝函数,它的功能是从源src所指的内存地址的起始位置开始,拷贝n个字节到目标dst所指的内存地址的起始位置中。实现如下:
void* memcpy(void *dst,const void *src,size_t count)
{
void* ret = dst;
while (count--)
{
*(char*)dst = *(char*)src;
dst = (char*)dst + 1;
src = (char*)src + 1;
}
return ret;
}
源代码比较简单,定义一个计数,然后从头到尾一次将src指向的值拷贝给dst,库函数中的memcpy不能处理dst和src中存在重叠部分这种情况。
那么处理重叠部分的话,我们可以采用从后往前依次拷贝的方法,下面给出我修改过的函数代码:
void* memcpy(void* dst, const void* src, size_t count)
{
char *pDst = static_cast<char *> (dst);
const char* pSrc = static_cast<const char*>(src);
if (pDst == NULL || pSrc == NULL || count <=0)
{
return NULL;
}
if (pDst > pSrc && pDst < pSrc + count)
{
for (size_t i = count - 1; i>=0;i--)
{
pDst[i] = pSrc[i];
}
}
else
{
for (size_t i = 0;i <count;i++)
{
pDst[i] = pSrc[i];
}
}
return pDst;
}
三、strcpy是C语言的标准库函数,使用strcpy需要包含以下头文件:
#include <string.h>
#include <stdio.h>
其函数功能是把从src地址开始且含有NULL结束符的字符串复制到dst开始的地址空间,返回指向dst的指针。其函数代码如下:
char* strcpy(char *dst,char *src)
{
if (dst == NULL || src == NULL)
{
return NULL;
}
if (dst == src)
{
return dst;
}
char* ret = dst;
while ((*dst++ = *src++) != '\0')
return ret;
}
strcpy和memcpy的不同点
这个也是常见的考点,主要分为以下三点不同:
复制内容不同:strcpy只能复制字符串,而memcpy可以复制任何内容,例如字符数组,整型,结构体等
复制的方法不同:strcpy不需要指定长度,它遇到字符串结束符’\0’才结束,所以容易溢出。memcpy则需要传入第三个参数来指定长度
用途不同:通常在复制字符串的时候用strcpy,而需要复制其他数据类型的时候则一般用memcpy。