前言
内存函数是一种,对任何数据类型都能进行操作的函数,对其进行解析和学习,能让我们对内存函数和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;
}