memcpy(内存拷贝函数)
memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度;
#include <string.h>
void* memcpy(void* destination, const void* source, size_t num);
void* dest 目标内存 const void* src 源内存 size_t num 字节个数
return:函数返回一个指向dest的指针。
void *mymemcpy(void *dst, const void *src, size_t num)
{
assert((NULL != dst) && (NULL != src));
int wordnum = num / 4; //计算有多少个32位,按4字节拷贝
int slice = num % 4; //剩余的按字节拷贝
int *pintsrc = (int *)src; //强制转换类型,不同类型的不能进行拷贝
int *pintdst = (int *)dst;
while(wordnum--)
{
*pintsrc++ = *pintsrc++;
}
while(slice--)
{
((char *)pintdst++) = *((char *)pintsrc++);
}
return dst;
}
strcpy()函数
strcpy只能应用字符类型的复制
#include <string.h>
char *strcpy(char *dest,const char *src);
return:成功执行后返回目标数组指针 dest
dest :目标字符串指针,src :源字符串指针。
注意:src 和 dest 所指的内存区域不能重叠,且 dest 必须有足够的空间放置 src 所包含的字符串(包含结束符)。
如果参数 dest 所指的内存空间不够大,可能会造成缓冲溢出(buffer Overflow)的错误情况,在编写程序时请特别留意,或者用strncpy()来取代。
void* my_strcpy(void *arr, void *brr)
{
int j = 0;
int k = 0;
while(brr[j] != 0)
{
arr[j] = brr[j];
j++;
}
arr[j] = '\0';
return arr;
}
-
memcpy相比使用strcpy会更加的安全,当然也可以使用strcpy的安全板本strncpy函数;
-
strcpy一定会拷贝字符串结尾符’\0’,memcpy在拷贝字符串的时候,根据指定拷贝字节数拷贝字符串,是否拷贝‘\0’结束符,根据count的大小。
-
strcpy只能应用字符类型的复制,而memcpy应用范围更广,任何类型都可以;
-
在拷贝相同的字符串,且字节数相同(包括‘]0’)的情况下,strcpy效率比memcpy效率更快。
-
memcpy() 并不关心被复制的数据类型,只是逐字节地进行复制,strcpy()只适合赋值字符串