前言
内存函数是一种,对任何数据类型都能进行操作的函数,对其进行解析和学习,能让我们对内存函数和c语言有更加深刻的理解。
一、内存函数介绍
1.memcpy函数介绍
1.声明
2.功能function

3. Parameters参数
4.Return Value返回值
destination is returned.
返回 void*destination
2.memmove函数介绍
1.声明

2.function功能

3. Parameters参数

4.Return Value返回值
destination is returned.
返回 void*destination
二、库函数memcpy和memmove 的使用实例
1.memcpy实例
1.代码
#include <stdio.h>
#include <string.h>
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[10] = { 0 };
memcpy(arr2, arr1, 40);
return 0;
}
2.调试运行,观察arr2
执行memcpy前arr2内部全部初始化为0

执行memcpy后arr2内部已经被全部copy为arr1中的数据

2.memmove实例
1.代码
#include <stdio.h>
#include <string.h>
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
memmove(arr1, arr1+3, 16);
return 0;
}
将1234替换为4567
2.调试运行,观察arr1
运行memmove前

运行memmove后

1234被替换为4567
三、模拟实现memcpy和memmove函数
1.memcpy模拟实现
明确void*类型传参,面对不同的数据类型 ,不同的步长,如何用一个“万能”代码,实现对任意数据类型都可以实现拷贝,是解决的关键
1.了解内存布局原理

2.代码实现memcpy
下面给出一种实现这一功能的代码
void*my_memcpy(void* dest, const void* str, size_t num)
{
assert(dest);//防止*操作空指针
assert(str);
void* ret = dest;//存储det的地址,用于返回初det的值
while (num--)//当num字节数减为0时停止
{
*(char*)dest = *(char*)str;//将指针强制转化为char*,步长为字节,通过对字节操作,实现
((char*)dest)++;//分别使地址向下移动一位
((char*)str)++;//分别使地址向下移动一位
}
return ret;//返回det初始值
}
2.memmove的模拟实现
memmove主要实现内存重叠的copy,如何解决内存重叠部分使用memcpy会出现的覆盖现象,为 实现memmove的关键。
1.内存布局分析

2.代码实现
在上面memcpy基础上加上条件语句进行分支即可
void* my_memmove(void* det, void* src, size_t num)
{
void* ret = dest;
assert(det);
assert(src);
if (det < src)//det<src 前->后
{
while(num--)
{
*(char*)det = *(char*)src;
dest = (char*)det + 1;
src = (char*)src + 1;
}
}
else //det>=src 后->前
{
while (num--)
{
*((char*)det + num) = *((char*)src + num);
}
}
return ret;
}
本文详细解读了C语言中memcpy和memmove内存函数的工作原理、参数与返回值,并通过实例演示了它们在实际编程中的应用。同时,还介绍了如何模拟实现这两种函数以应对不同数据类型的复制需求,以及它们在内存重叠情况下的区别。



1364

被折叠的 条评论
为什么被折叠?



