用C语言实现的内存拷贝函数的示例代码,包括使用标准函数库中的memcpy
和memmove
函数,以及自定义的my_memcpy
和my_memmove
函数。
memcpy
函数用于在内存中拷贝一段数据,参数dest
表示目的地(要粘贴的地方),src
表示源头(要复制的地方),num
表示要拷贝的字节数。memcpy
函数适用于非重叠的内存拷贝。
my_memcpy
函数是自定义的内存拷贝函数,与memcpy
功能相同,可以处理非重叠的内存拷贝。通过逐个字节的复制,将源数据复制到目标地。
memmove
函数用于在内存中拷贝一段数据,与memcpy
功能相似,但可以处理重叠的内存拷贝。如果目标地址和源地址有重叠部分,则根据地址的前后关系选择不同的拷贝方式。
my_memmove
函数是自定义的内存拷贝函数,与memmove
功能相同,可以处理重叠的内存拷贝。根据目标地址和源地址的前后关系,选择不同的拷贝方式。
在示例代码中,分别使用memcpy
和my_memcpy
函数将数组arr1
的内容拷贝到数组arr2
中,并输出结果。
接下来,使用memmove
和my_memmove
函数将数组arr5
的内容拷贝到arr5+3
的位置,并输出结果。
请注意,这只是一个示例代码,用来演示内存拷贝函数的使用。实际使用时,需要根据具体情况进行适当的参数校验和错误处理。
#include <stdio.h>
#include <string.h>
#include <assert.h>
//函数拷贝结束后会返回目标空间的地址,不重叠拷贝
void* my_memcpy(void* dest,const void * src,size_t num)?
{
?? ?void* ret = dest;
?? ?assert(src&&dest);
?? ?while(num--)
?? ?{
?? ??? ?*(char*)dest = *(char*)src;
?? ??? ?//++(char*)dest;
?? ??? ?//++(char*)src;
?? ??? ?dest = (char*)dest + 1;
?? ??? ?src = (char*)src + 1;
?? ?}
?? ?return ret;
}
//重叠拷贝
void* my_memmove(void* dest, const void* src, size_t num)
{
?? ?void* ret = dest;
?? ?assert(src && dest);
?? ?//如果dest和src有交集,要考虑指针的前后问题
?? ?//dest>src 后->前拷贝
?? ?//dest<src 前->后拷贝
?? ?if (dest<src)?
?? ?{
?? ??? ?while (num--)
?? ??? ?{
?? ??? ??? ?*(char*)dest = *(char*)src;
?? ??? ??? ?dest = (char*)dest + 1;
?? ??? ??? ?src = (char*)src + 1;
?? ??? ?}
?? ?}
?? ?else?
?? ?{
?? ??? ?while (num--)?
?? ??? ?{
?? ??? ??? ?*((char*)dest + num) = *((char*)src + num);
?? ??? ?}
?? ?}
?? ?return ret;
}
int main()?
{
?? ?//memcpy内存拷贝函数:用来处理不重叠的内存拷贝
?? ?//返回值:void*
?? ?//参数:void* dest目的地(粘贴的地方),void* src源头(复制的地方),size_t num字节大小
?? ?//遇到/0不会停
?? ?int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
?? ?int arr2[20] = { 0 };
?? ?//将arr1的内容,拷贝到arr2中
?? ?memcpy(arr2,arr1,40);
?? ?int i = 0;
?? ?for (i=0;i<20;i++)?
?? ?{
?? ??? ?printf("%d\n",arr2[i]);
?? ?}
?? ?//手动实现内存拷贝函数
?? ?int arr3[] = { 1,2,3,4,5,6,7,8,9,10 };
?? ?int arr4[20] = { 0 };
?? ?my_memcpy(arr4,arr3,20);
?? ?int j = 0;
?? ?for (j=0;j<5;j++)?
?? ?{
?? ??? ?printf(" %d\n",arr4[j]);
?? ?}
?? ?//memmove内存拷贝函数:用来处理重叠的内存拷贝
?? ?//返回值:void*
?? ?//参数:void* dest目的地,void* src源头,size_t num字节大小
?? ?//遇到/0不会停
?? ?int arr5[] = { 1,2,3,4,5,6,7,8,9,10 };
?? ?//将arr5的内容,拷贝到arr5+3中
?? ?memmove(arr5+3,arr5, 20);
?? ?int k = 0;
?? ?for (k = 0; k < 10; k++)
?? ?{
?? ??? ?printf(" ?%d\n", arr5[k]);
?? ?}
?? ?//手动实现内存拷贝函数
?? ?int arr6[] = { 1,2,3,4,5,6,7,8,9,10 };
?? ?my_memmove(arr6+2, arr6, 20);
?? ?int l = 0;
?? ?for (l=0;l<10;l++)?
?? ?{
?? ??? ?printf(" ? %d\n",arr6[l]);
?? ?}
?? ?return 0;
}