模拟实现库函数memcpy,memmove
库函数memcpy和memmove功能都很强大也很重要,现在通过自我编码方式实现两个库函数的功能。
1.memcpy是C和C++使用的内存拷贝函数,函数原型为
void *memcpy(void *destin, void *source, unsigned n);
函数的功能是从源内存地址的起始位置开始拷贝若干个字节到目标内存地址中,即从源source中拷贝n个字节到目标destin中。
2.memmove用于拷贝字节,函数原型为:
void memmove( void dest, const void* src, size_t count );
如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,但复制后源内容会被更改。
3.作用与其区别:
他们的作用是一样的,唯一的区别是,当内存发生局部重叠的时候,memmove保证拷贝的结果是正确的,memcpy不保证拷贝的结果的正确。
第一种情况下,拷贝重叠的区域不会出现问题,内容均可以正确的被拷贝。
第二种情况下,问题出现在右边的两个字节,这两个字节的原来的内容首先就被覆盖了,而且没有保存。所以接下来拷贝的时候,拷贝的是已经被覆盖的内容,显然这是有问题的。
实际上,memcpy只是memmove的一个子集。
代码实现两个函数:
1.memcpy
void* my_memcpy(void* b, const void* a, int num)
{
assert(b);
assert(a);
char* p = (char*)b;
char* q = (const char*)a;
while (num) {
*p++ = *q++;
num--;
}
return b;
}
int main()
{
int a[] = {
1,2,3,4,5,6 };
int b[10] = {
0 };
my_memcpy(b, a, sizeof(a));
for (int i = 0; i < 10; i++) {
printf("%d ", b[i]);
}
return 0;
}
2.memmove
#include<stdio.h>
#include<assert.h>
#include<string.h>
void* my_memmove(void* b, void* a, int num)
{
assert(b);
assert(a);
char* p = (char*)b;
char* q = (char*)a;
if (q < p && p < q + num) {
q = q + num - 1;
p = p + num - 1;
while (num) {
*p-- = *q--;
num--;
}
}
else
while (num) {
*p++ = *q++;
num--;
}
return b;
}
int main()
{
/*int a[] = { 1,2,3,4,5,6 };
int b[10] = { 0 };*/
char str[10] = "abcde123";
my_memmove(str + 1, str, strlen(str) + 1);
/*for (int i = 0; i < 10; i++) {
printf("%d ", b[i]);
}*/
printf("%s", str);
return 0;
}