本篇文章介绍c语言库函数memcpy()、memmove()、memcmp()、memset()的使用。
memcpy()实现的是内存块拷贝。
下面是cplusplus网站关于这个库函数的介绍以及使用
说明:
使用:
代码实现:
#include<assert.h>
void* my_memcpy(void* destination, const void* source, size_t num)
{
assert(destination && source); //空指针判断
void* dest = destination;
while (num--)
{
*(char*)destination = *(char*)source;
destination = (char*)destination + 1;
source = (char*)source + 1;
}
return dest;
}
代码测试:
两个独立内存块的拷贝
重叠内存块的拷贝
观察输出结果:
输出的结果和memcpy()的结果不相同;
memcpy()是visual studio编译器库函数,实现的功能包含了重叠内存块的拷贝;
my_memcpy()实现的方式是从source的指向的第一个字节一直拷贝到num个字节,按照的是从前往后拷贝,这种实现方式,导致了前面的字节数据覆盖了后面的字节数据,即改变了源数据。
所以,my_memcpy()只能拷贝两个没有交集的两个内存块。
memmove()是实现两个内存块的移动。本质还是两个内存块的拷贝。
下面是cplusplus网站关于这个库函数的介绍以及使用
说明:
使用:
实现思路:
考虑的情况:
情景一:destination和source指向的内存块没有交集
在这种情况下,无论从前往后拷贝还是从后往前拷贝,都可以保证source指向的数据完整性。
情景二:destination和source指向的内存块有交集
在这种情景下,有两种情况
情况一:destination在source的后面
情况二:destination在source的前面
情况一的处理方式:
当destination在source后面时,应该从source指向的第num个字节开始拷贝,即从后往前拷贝。
这样做可以实现source的第一个字节到第num个字节不会被覆盖。
情况二的处理方式:
当destination在source后面时,应该从source指向的第1个字节开始拷贝,即从前往后拷贝。
这样做可以实现source的第一个字节到第num个字节不会被覆盖。
代码实现:
void* my_memmove(void* destination, const void* source, size_t num)
{
assert(destination && source);
void* dest = destination;
if (destination < source)
{
//前->后
while (num--)
{
*(char*)destination = *(char*)source;
destination = (char*)destination + 1;
source = (char*)source + 1;
}
}
else
{
//后->前
while (num--)
{
*((char*)destination + num) = *((char*)source + num);
}
}
return dest;
}
代码测试:
memcmp()实现的是两个内存块的比较。
下面是cplusplus网站关于这个库函数的介绍以及使用
说明:
使用:
memset()实现的是填充内存块。
下面是cplusplus网站关于这个库函数的介绍以及使用
说明:
使用:
本篇文章介绍了c语言库函数memcpy()、memmove()、memcmp()、memset()的使用,以及模拟实现了memcpy()和memmove()。