C手写内存不重叠/重叠拷贝函数
用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;
 }
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!