模拟实现memcpy
函数原型:
void * memcpy ( void * destination, const void * source, size_t num );memcpy函数的功能是从源sourse所指的内存地址的起始位置开始拷贝num个字节到目标destination所指的内存地址的起始位置中。
- 如果目标数组destination本身已有数据,执行memcpy函数后,将覆盖原有数据(最多覆盖num个)。如果要追加数据,则每次执行memcpy后,要将目标数组地址增加到你要追加数据的地址。
不检查源中的’\0’,复制精确的num字节。
实现:
#include<stdio.h>
#include<assert.h>
void *my_memcpy(void *destination, const void *source, size_t num)
{
assert(destination);
assert(source);
assert(num > 0);
char *p = (char *)destination;
char *q = (char *)source;
while (num--)
{
*p++ = *q++;
}
return destination;
}
int main()
{
char src[] = "abcdefg";
char dest[10] = "hello";
my_memcpy(dest, src, 4);
printf("dest = %s\n", dest);
system("pause");
return 0;
}
程序执行结果:
模拟实现memmove
函数原型:
void * memmove ( void * destination, const void * source, size_t num );将num字节的值从源指向的位置复制到目的地所指向的内存块。
memcpy只是简单的将两块内存区域当作没有关系的相互独立内存区域进行内存的拷贝,而memmove则考虑了当两块内存区域有重叠时所采用不同方向的拷贝模式进行处理。
- 实现:
#include<stdio.h>
#include<assert.h>
void *my_memmove(void *destination, const void *source, size_t num)
{
assert(destination);
assert(source);
//从右向左拷贝
char *p = (char *)destination;
char *q = (char *)source;
if ((char *)destination > (char *)source && (char *)destination < (char *)source + num)
{
p = p + num - 1;
q = q + num - 1;
while (num--)
{
*p-- = *q--;
}
}
//从左向右拷贝
else
{
while (num--)
{
*p++ = *q++;
}
}
return destination;
}
int main()
{
char arr[20] = "hello";
my_memmove(arr + 2, arr, strlen(arr) + 2);
printf("new arr = %s\n", arr);
system("pause");
return 0;
}
程序执行结果: