这三个函数都是内存拷贝,目的都是将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)

{
   
assert(dest!=NULL && src != NULL);
   
char* d=dest;
  const char* s=src;
                while(n--)
                   *d++ = *s++;
        
return dest;
         }

 
 
      头文件: #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*
memccpy(void* dest,const void* src, int c, size_t n)

{
     assert(dest!=NULL && src != NULL);
     while( n )

{
*(char
*) dest = *(char *)srcl;
dest
= (char *)dest + 1;
if(*(char
*)src == (char)c)
break;
src
= (char *)src + 1;
n--;
}
         return (n ? dest : NULL);
        }
 
       头文件: #include <string.h>
       函数原型: void *memmove(void *dest, const void *src, size_t n);
       函数说明:由src所指内存区域复制count个字节到dest所指内存区域。如果目标区域和源区域有重叠的话,                      memcpy会出现错误,而memmove能正确地实施拷贝,但这也增加了一点点开销。memmove能够保证源                串在被覆盖之前将重叠区域的字节拷贝到目标区域中。但复制后src内容会被更改。但是当目标区域与源区域                没有重叠则和memcpy函数功能相同。
             memmove的处理措施:
                    (1)当源内存的首地址等于目标内存的首地址时,不进行任何拷贝
                   (2)当源内存的首地址大于目标内存的首地址时,实行正向拷贝
                   (3)当源内存的首地址小于目标内存的首地址时,实行反向拷贝
      函数实现:
             void *memmove(void *dest, const void *src, size_t n)
            {
assert(dest!=NULL
&& src != NULL);
char
*d = (char *)dest;
const
char* s = (const char*)src;
if(s
> d)
{
while(n--)
*d++
= *s++;
}
else
if(s < d)
{
d
= d + n - 1;
s
= s + n - 1;
while(n--)
*d--
= *s--;
}
return
dest;
 
 }
 
 
 

当dest <= src-count 或dest >= src+count时,以上三个函数均不会产生覆盖问题,即源数据不会被更改。
  若不在以上范围内,则源数据会被更改。  如: 
char a[]={'a','b'}; 
char b[]={'c','d','e','f','g','h'};  

   memmove(a,b,sizeof(b)); 
或是直接char *p=b+2;memmove(p,b,sizeof(b));  
  输出数据会发现b中数据输出已被更改。 
       发现即使a数组指向的空间不够存储数据,也能够移动成功。 
  原因|dest - src |<count 
如果在使用这些函数时,分配给足够的空间,然后再使用就不会出现覆盖问题。也就是
说如果外部分配给的空间不足以存储要拷贝的数据时,就有可能出现源数据被覆盖更改
的问题。

 
#include<stdio.h>
     #include<stdlib.h>
     #include<string.h>

int main()
    {
         int i=0; 
  char a[9]={'a','b','c','d','e','f','g','h','\0'}; 
  char p[2]={'q','w'};//或char *p=a+2;
  memmove(p,a,sizeof(a));
    puts(a);
  printf("_____________________________________________\n");
  puts(p);
  printf("_____________________________________________\n");
  for(i =0;i<10;i++)
    printf("%c %d \n",*(a+i),a+i);
  printf("_____________________________________________\n");
  for(i =0;i<8;i++)
  printf("%c %d \n",*(p+i),p+i); 
    return 0;
     }

 
观察输出结果。  
      把memmove(p,a,sizeof(a));改为memcpy(p,a,sizeof(a));或memccpy(p,a,'e',sizeof(a));再观察输出结果。  
      可以看出在目的存储空间不足时,便会出现源数据被覆盖改变的问题。  如果目的存储空间分配足够的空间,则便不会出现覆盖问题。 
 
http://blog.csdn.net/q5707802/article/details/27236619

memmove、memccpy和memcpy的更多相关文章

  1. C++中memcpy和memmove

    二者都是内存拷贝 memcpy内存拷贝,没有问题;memmove,内存移动?错,如果这样理解的话,那么这篇文章你就必须要好好看看了,memmove还是内存拷贝.那么既然memcpy和memmove二者 ...

  2. memcpy与memmove

    函数原型: void* memcpy(void *dst,void const *src,size_t count) void* memmove(void *dst,void const *src,s ...

  3. C语言标准库函数memcpy和memmove的区别以及内存重叠问题处理

    ①memcpy()和memmove()都是C语言中的标准库函数,定义在头文件string.h中,作用是拷贝一定长度的内存的内容,原型分别如下: void *memcpy(void *dst, cons ...

  4. memmove和memcpy函数的区别及实现

    一.memmove()和memcpy()函数和strcpy()函数的区别: (1)使用的类型不同,strcpy()函数只对字符串进行操作:memmove()和memcpy()函数对所有类型都适用,为内 ...

  5. C语言memcpy()函数和memmove()函数

    C语言memcpy()函数和memmove()函数 关于 memcpy() 函数,请先看链接. memcpy() 函数和 memmove() 函数的函数原型如下: void* memcpy(void ...

  6. 内存及字符串操作篇strlen strchar strcmp strcoll strcpy strdup strstr strtok strspn strrchr bcmp bcopy bzero index memccpy memset

    bcmp(比较内存内容) 相关函数 bcmp,strcasecmp,strcmp,strcoll,strncmp,strncasecmp 表头文件 #include<string.h> 定 ...

  7. memcpy code

    memcpy #include <stddef.h> //#include <stdint.h> //uintptr_t is quoted.#include "st ...

  8. memmove 对同一个指针不操作

    memmove 对同一个指针不操作,所以调用memmove之前不用比较两个指针是否相同 void CTestDLLDlg::OnBnClickedButton6() { ; char* data = ...

  9. C 标准库 - string.h之memmove使用

    memmove Move block of memory Copies the values of num bytes from the location pointed by source to t ...

随机推荐

  1. matlab 正则表达式

    regexprep Replace text using regular expression collapse all in page Syntax newStr = regexprep(str,e ...

  2. BAPC2014 C&amp;&amp;HUNNU11583:Citadel Construction(几何)

    题意: 给出一系列的点,要求寻找最多4个点.使得组成一个面积最大的多边形 思路: 非常显然仅仅有两种情况.要么是三角形,要么是四边形 首先不难想到的是.先要把最外面的点都找出来,事实上就是找凸包 可是 ...

  3. 【搜索引擎Jediael开发笔记】v0.1完整代码 2014-05-26 15:17 463人阅读 评论(0) 收藏

    详细代码请见 E:\Project\[重要]归档代码\SearchEngine归档代码 或 https://code.csdn.net/jediael_lu/jediael/tree/10991c83 ...

  4. 【53.61%】【BZOJ 2302】[HAOI2011]Problem c

    Time Limit: 30 Sec Memory Limit: 256 MB Submit: 526 Solved: 282 [Submit][Status][Discuss] Descriptio ...

  5. java并发api总结

    开发十年,就只剩下这套架构体系了! >>>   1.java.util.concurrent包 1.1 Executors Executor:接口,仅有一个方法为execute(Ru ...

  6. [Grid Layout] Use the minmax function to specify dynamically-sized tracks

    Using minmax() is an amazingly useful way to specify boundaries for the smallest and largest size a ...

  7. LUA整合进MFC代码

    这几天研究了一下lua,主要关注的是lua和vc之间的整合,把代码都写好放在VC宿主程序里,然后在lua里调用宿主程序的这些代码(或者叫接口.组件,随便你怎么叫),希望能用脚本来控制主程序的行为.这实 ...

  8. 断言(Assert)与异常(Exception)

    ## 断言和异常 断言是用来检查非法情况而不是错误情况的,用来帮开发者快速定位问题的位置. 异常处理用于对程序发生异常情况的处理,增强程序的健壮性和容错性. ## 断言的使用 在防御式编程中经常会用断 ...

  9. DDoS ATTACK PROCESSING APPARATUS AND METHOD IN OPENFLOW SWITCH

    An OpenFlow switch in an OpenFlow environment includes an attack determination module to collect sta ...

  10. Sitecore

    Sitecore 功能最强大.最丰富的企业级 .NET 网站内容管理系统.包含的功能如下所述: 内容编辑和会话中的个性化 用于预览访客所看到的网站内容的体验浏览器 设备和地理位置 IP 检测(需要额外 ...