memmove函数用法
来源:互联网 发布:元数据和主数据的区别 编辑:程序博客网 时间:2024/05/03 19:05
memmove用于从src拷贝count个字符到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。但复制后src内容会被更改。但是当目标区域与源区域没有重叠则和memcpy函数功能相同。
函数简介
原型:void *memmove( void* dest, const void* src, size_t count );
头文件:<string.h>
功能:由src所指内存区域复制count个字节到dest所指内存区域。
相关函数:memset、memcpy
2程序示例 // memmove.c
#include <stdio.h>
#include <string.h>
int main(void)
{
char s[]="Golden Global View";
memmove(s,s+7,strlen(s)+1-7);
printf("%s",s);
getchar();
return 0;
}
程序输出结果:Global View
memcopy 和 memmove的区别
两个函数都在头文件string.h中定义,函数原型为:
void * __cdecl memcpy ( void * dst,const void * src,size_t count);
void * __cdecl memmove ( void * dst,const void * src,size_t count);
实现代码如下:
void * __cdecl memcpy ( void * dst,const void * src,size_t count)
{
void * ret = dst;
while (count--) {
// 注意, memcpy函数没有处理dst和src区域是否重叠的问题
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}
return(ret);
}
void * __cdecl memmove ( void * dst,const void * src,size_t count)
{
void * ret = dst;
if (dst <= src || (char *)dst >= ((char *)src + count))
{ // 若dst和src区域没有重叠,则从起始处开始逐一拷贝
while (count--) {
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}
}
else
{ // 若dst和src 区域交叉,则从尾部开始向起始位置拷贝,这样可以避免数据冲突
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);
}
总结一下: 当src和dst区域没有重叠时,两个函数是完全一样的。木有重叠的条件是: dst <= src || (char *)dst >= ((char *)src + count 。否则,memcpy是不能正常工作的,memmove是可以正常工作的。
- memmove函数用法
- memmove函数用法
- memmove() 函数
- memmove函数
- memmove函数
- memmove函数
- memmove函数
- memmove函数
- memmove 函数
- memmove函数
- 内存拷贝函数strcpy()、memcpy()、memmove()、memset()的用法
- C语言函数memcpy(),memmove(),memcmp()用法详解
- memmove的用法
- memcpy,memccpy,memmove函数
- Memmove 函数说明
- 字符串函数memmove
- memcpy函数, strcpy(), memmove().
- memmove函数的实现
- Android 首字母分组快速索引 自定义WaveSiderBarView
- 故事
- 驱动程序——MCP4922——基于STM32F103
- Groovy中的面向对象
- springmvc知识点概况(一)
- memmove函数用法
- ApplicationMaster,ResourceManager和NodeManager通信过程
- jquery向上滚动页面的写法
- codeforces 805A
- ACM——Chasing problem
- form之action的绝对路径与相对路径(转载自用)
- nodejs热部署——hotnode
- 将数组转换为List方式
- Groovy基本句法