Hello大家好! 很高兴与大家见面! 给生活添点快乐,开始今天的编程之路。
1 memcpy的作用:
memcpy是内存复制函数,作用和strcpy类似,只不过能实现更多的功能
2 定义
void * memcpy ( void * destination, const void * source, size_t num );
所以注意事项:
• 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。
(这个函数有三个参数, destination是目的地、source是源头、num表示复制几个字节【记住这里是字节而不是其他单位】,函数的意思是将源头(source)中num个字节字节所对应的内容复制到目的地(destination)。
• 这个函数在遇到 '\0' 的时候并不会停下来。
、
• 如果source和destination有任何的重叠,复制的结果都是未定义的【即结果会和想象中的不一样】。
3 使用(会说明 如果source和destination有任何的重叠,复制的结果都是未定义的)
3.1未有任何的重叠

3.2 有重叠

只是在编译器vs2022上的结果虽然得到的结果是正常的,但是要注意的是其实memcpy函数不支持重叠,所以我们不要在使用memcpy函数进行重叠复制时得到正常的结果就以为没错,这只是少许编译器能得到正常的结果,所以我们只要理解为memcpy函数不支持重叠,但是少许编译器支持重叠,就好比你家人要你考60分,你却考了70分,那为什么1会出现这种结果呢?

当我们把1和2复制到3和4的位置是3和4就变为1和2,再将以前3和4位置所对应的数即1和2复制到5和6所对应的位置则5和6变为1和2,不断循环。所以memcpy函数是不支持重叠。
3.3memcpy模拟实现
未有任何的重叠

有重叠

总结 memcpy对有重叠的模拟实现和直接使用memcpy函数对有重叠的内存复制结果不相等再次说明了memcpy函数不支持重叠,但是少许编译器支持重叠。
1作用
memmove作用和memcpy一样只是memmove函数支持重叠内存拷贝
2定义
void * memmove ( void * destination, const void * source, size_t num ); 各参数定义和 memmove 函数一样
使用时要注意
• 和memcpy的差别就是memmove函数处理的源内存块和⽬标内存块是可以重叠的。
• 如果源空间和⽬标空间出现重叠,就得使⽤memmove函数处理。
3memmove使⽤

3 memmove模拟实现
3.1首先我们要对重叠内存拷贝和不重叠内存拷贝分别进行分析怎么实现。
对不重叠内存拷贝和memcpy模拟实现一样,而重叠内存拷贝就要复杂一些。
3.2下面对重叠内存拷贝进行分析怎么实现
首先对memcpy函数是不支持重叠进行分析

当我们把1和2复制到3和4的位置是3和4就变为1和2,再将以前3和4位置所对应的数即1和2复制到5和6所对应的位置则5和6变为1和2,不断循环。所以memcpy函数是不支持重叠。
对重叠内存拷贝的分析
这里我们要分为从前往后和从后往前对内存拷贝分析【并且结合随着数组下标的变大地址也在变大】
这时以两个完全重合为中心进行分析


最后可得到的所以方法

模拟实现

1作用
memset是用来设置内存的,将内存以字节为单位设置成自己想要都内容
2定义
void * memset ( void * ptr, int value, size_t num );
3 memset函数的使⽤

1定义/作用
int memcmp ( const void * ptr1, const void * ptr2, size_t num ); • ⽐较从ptr1和ptr2指针指向的位置开始,向后的num个字节
•返回值:

如果返回值大于0,则第一个指针指向的字符串大,反之第二个指针指向的字符串大,如果等于0则第一个指针指向的字符串等于第二个指针指向的字符串
2 memcmp函数的使⽤

本篇文章就到此结束,欢迎大家订阅我的专栏,欢迎大家指正,希望有所能帮到读者更好的了解内存函数,后续会不断更新C/C++相关知识。