memcpy,memmove,memcmp模拟实现
memcpy()函数模拟实现
函数原型:
void* memcpy(void* destination,const void* source,size_t num);
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
void* my_memcpy(void* dest, const void* src,size_t num)
{
assert(dest && src);//断言,保证指针的有效性
void* ret = dest;
char* dest_1 = (char*)dest;//void* 类型的指针不能++,--,解引用*
char* src_1 = (char*)src;//强制类型转换为char*类型的指针,因为char*类型的指针解引用只能向后访问一个字节
while (num--)//先使用再--
{
*dest_1++ = *src_1++;//先解引用再++
}
return ret;//返回目标空间的地址
}
int main()
{
int arr1[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int arr2[10] = { 0 };
int i;
my_memcpy(arr2, arr1, 21);
for (i = 0; i < 10; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
输出:
1 2 3 4 5 6 0 0 0 0(我的是小端存储)
1 2 3 4 5 0 0 0 0 0(大端存储)
memmove()函数模拟实现
函数原型:
void* memmove(void* destination,const void* source,size_t num);
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
void* my_memmove(void* dest, const void* src, size_t num)
{
assert(dest && src);//断言,保证指针的有效性
void* ret = dest;
char* dest_1 = (char*)dest;
char* src_1 = (char*)src;
if (dest > src)
{
while (num--)
{
*(dest_1 + num) = *(src_1 + num);//从后往前赋值
}
}
else
{
while (num--)
{
*dest_1++ = *src_1++;//从前往后
}
}
return ret;//返回目标空间的地址
}
int main()
{
char str[20] = "123456789******";
my_memmove(str, str+2, 5);
printf("%s\n", str);
return 0;
}
输出:
345676789******
memcmp()函数模拟实现
函数原型:
int memcmp(const void* ptr1,const void* ptr2,size_t num);
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
int my_memcmp(const void* ptr1, const void* ptr2, size_t num)
{
assert(ptr1 && ptr2);//断言,保证指针的有效性
char* p1 = (char*)ptr1;
char* p2 = (char*)ptr2;
while (num--)
{
if (*p1 > *p2)
{
return 1;
}
if (*p1 < *p2)
{
return -1;
}
p1++;
p2++;
}
return 0;
};
int main()
{
char str1[15] = "123456789**";
char str2[15] = "123459999**";
int ret = my_memcmp(str1, str2,7);
printf("ret=%d\n", ret);
return 0;
}