C手写内存不重叠/重叠拷贝函数

发布时间:2024年01月09日

用C语言实现的内存拷贝函数的示例代码,包括使用标准函数库中的memcpymemmove函数,以及自定义的my_memcpymy_memmove函数。

memcpy函数用于在内存中拷贝一段数据,参数dest表示目的地(要粘贴的地方),src表示源头(要复制的地方),num表示要拷贝的字节数。memcpy函数适用于非重叠的内存拷贝。

my_memcpy函数是自定义的内存拷贝函数,与memcpy功能相同,可以处理非重叠的内存拷贝。通过逐个字节的复制,将源数据复制到目标地。

memmove函数用于在内存中拷贝一段数据,与memcpy功能相似,但可以处理重叠的内存拷贝。如果目标地址和源地址有重叠部分,则根据地址的前后关系选择不同的拷贝方式。

my_memmove函数是自定义的内存拷贝函数,与memmove功能相同,可以处理重叠的内存拷贝。根据目标地址和源地址的前后关系,选择不同的拷贝方式。

在示例代码中,分别使用memcpymy_memcpy函数将数组arr1的内容拷贝到数组arr2中,并输出结果。

接下来,使用memmovemy_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;
}

文章来源:https://blog.csdn.net/qq_54933168/article/details/135410042
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。