
👦个人主页:@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函数在以往博客有讲解到 -> 传送门




















