一、memcpy()函数
- 函数原型
void * memcpy(void * destination, const void * source, size_t num) - 函数功能
(1)函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存中。
(2)这个函数在遇到‘\0’的时候不会停下来。
(3)如果source和destination有重叠,复制的结果都是未定义的。 - 头文件
#include <string.h> - 返回类型
返回一个指向dest的指针。
二、使用步骤
1.直接使用memcpy()函数
- 将arr1中的数组拷贝到arr2中(原代码)
#include <stdio.h>
#include <string.h>
int main()
{
int arr1[]={1,2,3,4,5};
int arr2[10]={0};
//将arr1中的数字拷贝到arr2中;
memcpy(arr2,arr1,sizeof(arr1));
return 0;
}
- 输出结果
(1)窗口显示
(2)如果输出arr2,如图所示。
#include <stdio.h>
#include <string.h>
int main()
{
int arr1[]={1,2,3,4,5};
int arr2[10]={0};
int i = 0;
//将arr1中的数字拷贝到arr2中;
memcpy(arr2,arr1,sizeof(arr1));
for(i = 0 ;i<5;i++)
{
printf("%d ",arr2[i]);
}
printf("\n");
return 0;
}
2.模拟实现memcpy()函数
1.将数组arr1中的数字拷贝到arr2中
#include <stdio.h>
#include <string.h>
#include <assert.h>
void* my_memcpy(void* dest,const void* src,size_t count)
{
char* ret = (char* )dest;
assert(dest!=NULL);
assert(src!=NULL);
while(count--)
{
*(char*)dest=*(char*)src;
++(char*)dest;
++(char*)src;
}
return ret;
}
int main()
{
int arr1[]={1,2,3,4,5};
int arr2[10]={0};
my_memcpy(arr2,arr1,sizeof(arr1));
return 0;
}
- 窗口显示,如图所示。
- 上述代码缺陷:不能重叠拷贝。
- 举例说明:
我们想执行的操作是将arr3中前五个数,即1,2,3,4,5拷贝放到arr3中的第三个数之后。如图所示。
#include <stdio.h>
#include <string.h>
#include <assert.h>
void* my_memcpy(void* dest,const void* src,size_t count)
{
char* ret = (char* )dest;
assert(dest!=NULL);
assert(src!=NULL);
while(count--)
{
*(char*)dest=*(char*)src;
++(char*)dest;
++(char*)src;
}
return ret;
}
int main()
{
int arr3[]={1,2,3,4,5,6,7,8,9,10};
my_memcpy(arr3+2,arr3,20);
return 0;
}
- 窗口显示结果
- 解决缺陷。使用memmove()函数或者memcpy函数。
总结
在C语言标准中:memcpy()函数可以拷贝不重叠的,在VS10、VS13环境下memcpy可以处理重叠拷贝。