一.memcpy
功能:从源内存地址起始位置拷贝若干个字节到目标地址中
void* my_memcpy(void* dst, const void* src, size_t count)
{
void* ret = dst;
while (count--)
{
*(char*)dst = *(char*)src;
dst = (char*)dst + 1;
src = https://www.it610.com/article/(char*)src + 1;
}
return ret;
}
但是在拷贝重叠时则可能会出现错误:
例如:
int main()
{
char arr1[20] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
my_memcpy(arr1+2, arr1, 4);
cout << arr1 << endl;
return 0;
}
在这里我们想从arr1起始位置拷贝4个字节到arr1+2的位置
想要得到的结果是:1 2 1 2 3 4 7 8 9
而实际的结果为:
文章图片
原因如下:
文章图片
在拷贝过程中,由于src在dst左侧,因此src内容发生改变,引起错误
解决方法:memmove
二.memmove
功能:memmove用于拷贝字节,但是目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,复制后源内容会被更改
void* my_memmove(void* dst, const void* src, size_t count)
{
void* ret = dst;
if (dst <= src)
{
while (count--)
{
*(char*)dst = *(char*)src;
dst = (char*)dst + 1;
src = https://www.it610.com/article/(char*)src + 1;
}
}
else
{
dst = (char*)dst + count - 1;
src = (char*)src + count - 1;
while (count--)
{
*(char*)dst = *(char*)src;
dst = (char*)dst - 1;
src = (char*)src - 1;
}
}
return ret;
}
【memcpy拷贝重叠及memmove】运行结果:
文章图片
memmove可以解决内存拷贝重叠引起的错误问题
- 当dst在src左侧或者在同一位置时,从前向后进行拷贝
- 其他情况则从后向前拷贝
推荐阅读
- C语言学习|第十一届蓝桥杯省赛 大学B组 C/C++ 第一场
- 【C】题目|【C语言】题集 of ⑥
- 单片机|自学单片机好找工作吗(会单片机能找什么工作?)
- 单片机|keil把源代码生成lib的方法
- c语言|一文搞懂栈(stack)、堆(heap)、单片机裸机内存管理malloc
- c语言|C语言初期学习遇到的特殊点 【三子棋详解】【初学者福音,详细总结,复习能手】
- 笔记|C语言数据结构——二叉树的顺序存储和二叉树的遍历
- 个人理解|【C语言基础之类型转换】
- c语言|【C语言】自定义类型 结构体 枚举 联合
- 学习分享|【C语言函数基础】