这三个函数都是内存拷贝,目的都是将N个字节的源内存地址的内容拷贝到目标内存地址中。
void * memmove(void *dest,void*src,int count)
void *memcpy(void *dest,void *src,int count)
void *memccpy(void*dest,void*src,int ch,int count)
头文件 : #include <string.h>
函数原型 : void *memcpy(void *dest, const void *src, size_t n)
函数说明 : memcpy()用来拷贝src所指的内存内容前n个字节到dest所指的内存地址上。与strcpy()不同的 是,memcpy()会完整的复制n个字节,不会因为遇到字符串结束’0’而结束
strcpy和memcpy主要有以下3方面的区别。
1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、 结构体、类等。
2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符”0”才结束,所以容易溢 出。memcpy则是根据其第3个参数
3 、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy
返回值: 返回指向dest的指针
void* memcpy(void* dest,const void* src, size_t n)
头文件: #include <string.h>
函数原型: void *memccpy(void *dest, const void *src, int c, size_t n);
函数说明:memccpy()用来拷贝src所指的内存内容前n个字节到dest所指的地址上。与memcpy()不同的 是,memccpy()如果在src中遇到某个特定值(int c)立即停止复制。
返回值: 如果c没有被复制,则返回NULL,否则,返回dest中字符c 后面紧挨一个字符位置的指针
函数实现:
函数原型: void *memmove(void *dest, const void *src, size_t n);
函数说明:由src所指内存区域复制count个字节到dest所指内存区域。如果目标区域和源区域有重叠的话, memcpy会出现错误,而memmove能正确地实施拷贝,但这也增加了一点点开销。memmove能够保证源 串在被覆盖之前将重叠区域的字节拷贝到目标区域中。但复制后src内容会被更改。但是当目标区域与源区域 没有重叠则和memcpy函数功能相同。

函数实现:
输出数据会发现b中数据输出已被更改。
原因|dest - src |<count
如果在使用这些函数时,分配给足够的空间,然后再使用就不会出现覆盖问题。也就是
说如果外部分配给的空间不足以存储要拷贝的数据时,就有可能出现源数据被覆盖更改
的问题。
观察输出结果。
把memmove(p,a,sizeof(a));改为memcpy(p,a,sizeof(a));或memccpy(p,a,‘e’,sizeof(a));再观察输出结果。
可以看出在目的存储空间不足时,便会出现源数据被覆盖改变的问题。 如果目的存储空间分配足够的空间,则便不会出现覆盖问题。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/206826.html