用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
#include
#include
//函数拷贝结束后会返回目标空间的地址,不重叠拷贝
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
if (dest
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;
}