zoukankan      html  css  js  c++  java
  • 对memcpy和memmove的疑惑

    微软编译器中memcpy的文档为:

    Copies bytes between buffers. More secure versions of these functions are available;

    void *memcpy( void *dest, const void *src, size_t count );

    Remarks:

    memcpy copies count bytes from src to dest; wmemcpy copies count wide characters (two bytes). If the source and destination overlap, the behavior of memcpy is undefined. Use memmove to handle overlapping regions.

    也就是说,memcpy的内存拷贝,要求dest和src的内存之间不能有重叠部分。例如

    [A][B][C]

    A、B、C表示三段连续的等长,且长度为L的内存空间,利用memcpy函数将地址为A,长度为2L的内存数据,复制到地址为B的空间是不可行的。MSDN中给出应该用memmove()代替。

    对以上内容进行了测试,结果有些让人疑惑。

    测试代码如下:

    #include <iostream>
    #include <string.h>
    using namespace std;
    
    
    int main(int argc,char ** argv)
    {
    	//s = aaaabbbcccc
    	char s[256] = {'a','a','a','a','b','b','b','c','c','c','c'};
    	
    	//memcpy(s,s+2,6);
    	memmove(s,s+2,6);
    
    	cout<<s<<endl;
    
    	system("pause");
    	return 0;
    }

    memcpy的dst和src之间有重叠部分,但memcpy和memmove得到的结果是相同的。并且从复制的逻辑上,得到的结果也是正确的。

    疑惑,不知道memcpy和memmove的区别到底在哪里。

  • 相关阅读:
    jQuery daily
    jQuery daily
    spring事务管理
    AspectJ AOP切面编程(XML配置)
    springAOP思想
    spring与web整合(交鸡肋,因为有前台框架封装了servlet)
    spring复杂对象注入四种方式
    spring的Bean注入和P标签使用
    spring Bean的作用域、生命周期和后处理器
    IoC容器实例化Bean三种方式
  • 原文地址:https://www.cnblogs.com/raymon/p/2311394.html
Copyright © 2011-2022 走看看