👦个人主页:@Weraphael
✍🏻作者简介:目前是C语言学习者
✈️专栏:C语言航路
🐋 希望大家多多支持,咱一起进步!😁
如果文章对你有帮助的话
欢迎 评论💬 点赞👍🏻 收藏 📂 加关注
前言
以下函数的查阅资料都在cplusplus网站
目录
- 前言
- 一、memcpy
- (1)memcpy函数介绍
- (2)memcpy函数用法
- (3)memcpy函数模拟实现
- (4)memcpy函数注意事项
- 二、memmove
- (1)memmove函数介绍
- (2)memmove函数用法
- (3)memmove函数模拟实现
- 三、memcmp
- (1)memcpy函数介绍
- (2)memcpy函数用法
- 四、memset函数
一、memcpy
(1)memcpy函数介绍
- 功能:内存拷贝
(2)memcpy函数用法
memcpy的意义和strcpy、strncpy是一样的。
不同的是:strcpy和strncpy只能拷贝字符串,而memcpy既能拷贝字符串,也能拷贝整型等等。
【拷贝整型】
【拷贝字符串】
(3)memcpy函数模拟实现
几个问题
- 函数返回类型为
void*
,是因为memcpy
需要返回目标空间的起始地址dest
和src
的类型都为void*
,是因为memcpy
可以拷贝任意类型,而void*
恰好可以结束任意类型的地址(指针)。这一块可参考qsort
的模拟实现 点击跳转- 由于类型不确定,所以只能一个字节一个字节交换内容,这一块同样参考
qsort
的模拟实现
(4)memcpy函数注意事项
- 要保证目标空间足够大
- 函数在遇到
‘\0’
的时候不会停下来- 如果
source
和destination
有任何重叠,复制的结果是未定义的
所以,如果想要重叠拷贝,需要用memmove(下面会介绍)
二、memmove
(1)memmove函数介绍
功能:移动内存块
(2)memmove函数用法
用法其实和memcpy一样,能移动字符、整型等类型
(3)memmove函数模拟实现
memmove需要分三种情况讨论
①当source在前,destination在后时
最好的办法就是从destination的4
开始往前拷贝,这样就不会导致复制的结果是未定义
②当source在后,destination在前时
最好的办法就是从destination的9
开始往后拷贝
③ 当source和destination未重叠时
既可以从前开始拷贝,也能从后开始拷贝
【代码实现】
#include <stdio.h>
#include <string.h>
void* my_memmove(void* dest, void* src, size_t num)
{
void* res = dest;
if (dest < src)
{
//从前向后拷贝(和memcpy一模一样)
while (num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else
{
//从后向前拷贝
while (num--)
{
*((char*)dest + num) = *((char*)src + num);
}
}
}
int main()
{
int a[20] = { 10,9,8,7,6,5,4,3,2,1 };
//将a中的8,7,6,5 拷贝到 a
my_memmove(a, a+2,16 );
for (int i = 0; i < 10; i++)
{
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
三、memcmp
(1)memcpy函数介绍
功能 :比较从ptr1和ptr2开始的num个字节
(2)memcpy函数用法
用法其实和strcmp、strncmp差不多 ->点我跳转
四、memset函数
功能:内存设置函数(以字节为单位来设置内存中的数据)
memset函数在以往博客有讲解到 -> 传送门