memcpy()的实现:
// A C implementation of memcpy()
#include<stdio.h>
#include<string.h>
void myMemCpy(void *dest, void *src, size_t n)
{
//此处应加assert(dest != NULL && src != NULL);
// Typecast src and dest addresses to (char *)
char *csrc = (char *)src;
char *cdest = (char *)dest;
// Copy contents of src[] to dest[]
for (int i=0; i<n; i++)
cdest[i] = csrc[i];
}
// Driver program
int main()
{
char csrc[] = "GeeksforGeeks";
char cdest[100];
myMemCpy(cdest, csrc, strlen(csrc)+1);
printf("Copied string is %s", cdest);
int isrc[] = {10, 20, 30, 40, 50};
int n = sizeof(isrc)/sizeof(isrc[0]);
int idest[n], i;
myMemCpy(idest, isrc, sizeof(isrc));
printf("\nCopied array is ");
for (i=0; i<n; i++)
printf("%d ", idest[i]);
return 0;
}
memcpy有个问题就是当src和dst有重叠时,在copy过程中就会覆盖以后要copy的内容。此时应该用memmove。
下面的代码来自
原文链接:https://blog.csdn.net/z702143700/article/details/47107701
void* memmove(void* dst,const void* src,size_t count)
{
assert(NULL !=src && NULL !=dst);
char* tmpdst = (char*)dst;
char* tmpsrc = (char*)src;
if (tmpdst <= tmpsrc || tmpdst >= tmpsrc + count)
{
while(count--)
{
*tmpdst++ = *tmpsrc++;
}
}
else
{
tmpdst = tmpdst + count - 1;
tmpsrc = tmpsrc + count - 1;
while(count--)
{
*tmpdst-- = *tmpsrc--;
}
}
return dst;
}
也可以先从src拷贝到一个临时数组tmp,再从tmp拷贝到dest。不过这个空间复杂度是O(n)。
下面的代码来自
https://www.geeksforgeeks.org/write-memcpy/
//C++ program to demonstrate implementation of memmove()
#include<stdio.h>
#include<string.h>
// A function to copy block of 'n' bytes from source
// address 'src' to destination address 'dest'.
void myMemMove(void *dest, void *src, size_t n)
{
// Typecast src and dest addresses to (char *)
char *csrc = (char *)src;
char *cdest = (char *)dest;
// Create a temporary array to hold data of src
char *temp = new char[n];
// Copy data from csrc[] to temp[]
for (int i=0; i<n; i++)
temp[i] = csrc[i];
// Copy data from temp[] to cdest[]
for (int i=0; i<n; i++)
cdest[i] = temp[i];
delete [] temp;
}
// Driver program
int main()
{
char csrc[100] = "Geeksfor";
myMemMove(csrc+5, csrc, strlen(csrc)+1);
printf("%s", csrc);
return 0;
}
strcpy()只能拷贝字符串,当遇到字符串末尾的NULL(‘\0’)时,它会删除该字符,并结束拷贝。
memcpy()可以拷贝任意类型的字符,不会考虑NULL字符,只拷贝所指定要拷贝的字符数。
一个strcpy的代码例子如下:
void *strcpy(char *strDest, const char *strSrc) {
assert(strDest != NULL & strSrc != NULL);
char *addr = strDest;
while ((*strDest++ = *strSrc++) != '\0');
return addr;
}