内存函数详解与模拟实现
Ciallo~ (∠・ω< )⌒★
1. memcpy 的使用和模拟实现
函数原型:
void * memcpy ( void * destination, const void * source, size_t num );
功能:
函数 memcpy 从 source 的位置开始向后复制 num 个字节的数据到 destination 指向的内存位置。这个函数在遇到 ‘\0’ 的时候并不会停下来,什么时候停下来只由 num 大小决定。如果 source 和 destination 有任何的重叠,复制的结果都是未定义的。
模拟实现:
//模拟实现memcpy
void* my_memcpy(void* des, const void* src, size_t num)
{
assert(des && src);
void* ret = des;
while (num--) //这里是后置--,所以先用了一次进行判断,再 -1
{
*(char*)des = *(char*)src;
des = (char*)des + 1; //这里若写成des++不行,因为强制类型转换是临时的,之后des的类型还是void*
src = (char*)src + 1;
}
return ret;
}
2. memmove 的使用和模拟实现
函数原型:
void * memmove ( void * destination, const void * source, size_t num );
它和 memcpy 的差别就是 memmove 函数处理的源内存块和目标内存块是可以重叠的。如果源空间和目标空间出现重叠,就得使用 memmove 函数处理。
模拟实现:
模拟实现memmove
void* my_memmove(void* des, const void* src, size_t num)
{
assert(des && src);
void* ret = des;
//为了处理src与des重叠的情况,要采取两种不同的移动顺序,
//若首元素地址des小于src,则从前往后移动,反之则从后往前移动。
if (des < src) //从前往后
{
while (num--)
{
*(char*)des = *(char*)src;
des = (char*)des + 1; //这里若写成des++不行,因为强制类型转换是临时的,之后des的类型还是void*
src = (char*)src + 1;
}
}
else //从后往前
{
while (num--)
{
*((char*)des + num - 1) = *((char*)src + num - 1);
}
}
return ret;
}
3. memset 函数的使用
函数原型:
void * memset ( void * ptr, int value, size_t num );
memset 是用来设置内存的,将内存中的值以字节为单位设置成想要的内容。
使用测试:
#include <stdio.h>
#include <string.h>
int main ()
{
char str[] = "I love C!";
memset (str,'x',4);
printf("%s", str);
return 0;
}
打印结果:
xxxxve C!
4. memcmp 函数的使用
函数原型:
int memcmp ( const void * ptr1, const void * ptr2, size_t num );
这个函数比较从 ptr1 和 ptr2 指针指向的位置开始,向后的num个字节。比较方法与 strcmp 类似。若 ptr1 中的值大于 ptr2 中的值,则返回大于0的数字,若 * ptr1 == * ptr2,则返回0。若* ptr1 < * ptr2,则返回小于0的数字。
使用测试:
#include <stdio.h>
#include <string.h>
int main()
{
char str1[] = "Flame";
char str2[] = "Polemo";
int n;
n = memcmp(str1, str2, sizeof(str1));
if (n > 0)
printf("'%s' is greater than '%s' by %d.\n", str1, str2, n);
else if (n < 0)
printf("'%s' is less than '%s' by %d.\n", str1, srt2, n);
else
printf("'%s' is the same as '%s'.\n", str1, str2);
return 0;
}
在 VS2022 上的运行结果:
东风夜放花千树。更吹落,星如雨。宝马雕车香满路。凤箫声动,玉壶光转,一夜鱼龙舞。
蛾儿雪柳黄金缕。笑语盈盈暗香去。众里寻他千百度。蓦然回首,那人却在,灯火阑珊处。
今日元宵佳节,好诗配好码,祝愿各位在花灯耀眼、乐声盈耳的元夕盛况中,寻觅到那一位立于灯火零落处的孤高女子。