一、memcpy函数
1、memcpy函数的使用
void* memcpy(void* destination, const void* source, size_t num);
函数 memcpy 从 source 的位置开始向后复制 num 个字节的数据到 destination 指向的内存位置;
这个函数在遇到 ' \0' 的时候并不会停下来;
如果 source 和 destination 有任何的重叠,复制的结果都是未定义的。所以通常使用memcpy函数拷贝不重叠内存的数据;(对于重叠的内存,交给memmove来处理)
函数memcpy只关注要拷贝的数据在哪里,要存放到哪里,拷贝几个字节,至于内存中存放的是什么类型的数据,并不重要。
2、memcpy函数的模拟实现
#include<stdio.h>
#include<assert.h>
void* my_memcpy(void* des, const void* src, size_t num);
int main()
{
char str1[20];
char str2[] = "hello world!";
printf(my_memcpy(str1, str2, 5 * sizeof(str2[0])));
return 0;
}
void* my_memcpy(void* des, const void* src, size_t num)
{
assert(des);
assert(src);
void* res = des;
while (num)
{
*(char*)des = *(char*)src;
((char*)des)++;
((char*)src)++;
num--;
}
*(char*)des = '\0';
return res;
}
二、memmove函数
1、memmove函数的使用
void* memmove(void* destination, const void* source, size_t num);
memmove和 memcpy 的差别就是 memmove 函数处理的源内存块和目标内存块是可以重叠的。
如果源空间和目标空间出现重叠,就得使用 memmove 函数处理。
2、memmove函数的模拟实现
#include<stdio.h>
#include<assert.h>
void* my_memmove(void* des, const void* src, size_t num);
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
my_memmove(arr + 2, arr, 5 * sizeof(arr[0]));
for (int i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
void* my_memmove(void* des, const void* src, size_t num)
{
assert(des);
assert(src);
void* res = des;
if (des <= src || (char*)des + num <= (char*)src)
{
while (num)
{
*(char*)des = *(char*)src;
((char*)des)++;
((char*)src)++;
num--;
}
}
else
{
(char*)des = (char*)des + num - 1;
(char*)src = (char*)src + num - 1;
while (num)
{
*(char*)des = *(char*)src;
((char*)des)--;
((char*)src)--;
num--;
}
}
return res;
}
三、memset函数
1、memset函数的使用
void* memset(void* ptr, int value, size_t num);
memset 是用来设置内存的,将内存中的值以字节为单位设置成想要的内容。
四、memcmp函数
1、memcmp函数的使用
int memcmp(const void* ptr1, const void* ptr2, size_t num);
比较从 ptr1 和 ptr2 指针指向的位置开始,向后的 num 个字节
返回值如下:
return | indicates |
<0 | 在两个内存块中不匹配的第一个字节,在 ptr1 中的值低于在 ptr2 中的值。(在作为无符号字符值进行评估时) |
0 | 两个内存块的内容相等。 |
>0 | 在两个内存块中不匹配的第一个字节,在 ptr1 中的值高于在 ptr2 中的值。(在作为无符号字符值进行评估时) |