文章目录
- 前言
- 一、库函数memcpy()
- 1.1 memcpy()介绍
- 1.2 memcpy()模拟实现
- 二、库函数memmove()
- 2.1 memmove()介绍
- 2.2 memmove()模拟实现
- 三、库函数memcmp()
- 3.1 memcmp()介绍
- 四、库函数memset()
- 4.1 memset()介绍
- 总结
前言
本篇文章介绍c语言库函数memcpy()、memmove()、memcmp()、memset()的使用。
一、库函数memcpy()
1.1 memcpy()介绍
memcpy()实现的是内存块拷贝。
下面是cplusplus网站关于这个库函数的介绍以及使用
说明:
- 从source指向的内存块拷贝num个字节到destination指向的内存块中。
- source和destination的指针类型可以是任何类型,因为拷贝的是二进制数据。
- memcpy()不会在source检查终止字符,永远拷贝num个字节。
- memcpy()一般用于拷贝两个独立的内存块。
使用:
- 两个独立内存块的拷贝
- 重叠内存块的拷贝(重叠内存块:指destination和source指向同一块内存)
1.2 memcpy()模拟实现
代码实现:
#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()
2.1 memmove()介绍
memmove()是实现两个内存块的移动。本质还是两个内存块的拷贝。
下面是cplusplus网站关于这个库函数的介绍以及使用
说明:
- memmove()可以拷贝两个独立的内存块。
- memmove()也可以用于拷贝两个重叠的内存块。
- memmove()一般用于拷贝两个重叠的内存块。
使用:
2.2 memmove()模拟实现
实现思路:
考虑的情况:
情景一: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;
}
代码测试:
- destination > source
- destination < source
三、库函数memcmp()
3.1 memcmp()介绍
memcmp()实现的是两个内存块的比较。
下面是cplusplus网站关于这个库函数的介绍以及使用
说明:
- 每次比较一个字节的内容的大小,如果两个字节的内容不相等,直接返回比较结果
- 最多比较num个字节。
使用:
四、库函数memset()
4.1 memset()介绍
memset()实现的是填充内存块。
下面是cplusplus网站关于这个库函数的介绍以及使用
说明:
- 为ptr指向的内存块的num个字节赋值,每个字节的值为value
- value为int,当在填充时会被强制转化为unsigned char类型
使用:
总结
本篇文章介绍了c语言库函数memcpy()、memmove()、memcmp()、memset()的使用,以及模拟实现了memcpy()和memmove()。