zoukankan      html  css  js  c++  java
  • [转]memmove、memcpy和memccpy

    原文地址:http://www.cppblog.com/kang/archive/2009/04/05/78984.html

    在原文基础上进行了一些小修改~

    memmove、memcpy和memccpy三个函数都是内存的拷贝,从一个缓冲区拷贝到另一个缓冲区。
    memmove(void *dest,void*src,int count)
    memcpy(void *dest,void *src,int count)
    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个字节,不会因为遇到字符串结束''而结束
    返回值:   返回指向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)立即停止复制。
    返回值:   返回指向dest中值为c的下一个字节指针。返回值为0表示在src所指内存前n个字节中没有值为c的字节。
    表头文件: #include <string.h>
    定义函数: void *memmove(void *dest, const void *src, size_t n);
    函数说明:memmove()是从一个缓冲区移动到另一个缓冲区中。由src所指内存区域复制count个字节到dest所指内存区域。 
    返回值:   返回指向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 "stdafx.h" 
    #include "string.h" 
    #include "stdio.h"
    
     
    
    
    int main(int argc, char* argv[]) 
    {    int i=0; 
    char a[9]={'a','b','c','d','e','f','g','h',''}; 
    char p[3]={'q','w',''};//或char *p=a+2; 
    printf("%d,%d
    ",a,p); 
    printf("覆盖前:
    "); 
    puts(a); 
    printf("_____________________________________________
    "); 
    puts(p); 
    printf("_____________________________________________
    "); 
    memmove(p,a,sizeof(a)); 
    printf("覆盖后:
    "); 
    puts(a); 
    printf("_____________________________________________
    "); 
    puts(p); 
    printf("_____________________________________________
    "); 
    for(i =0;i<10;i++) 
    printf("%c %d 
    ",*(a+i),a+i); 
    printf("_____________________________________________
    "); 
    for(i =0;i<8;i++) 
    printf("%c %d 
    ",*(p+i),p+i);
    
    
        return 0; 
    }
    

      

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

    image

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

  • 相关阅读:
    Delphi XE4 FireMonkey 开发 IOS APP 发布到 AppStore 最后一步.
    Native iOS Control Delphi XE4
    Delphi XE4 iAD Framework 支持.
    using IOS API with Delphi XE4
    GoF23种设计模式之行为型模式之命令模式
    Android青翼蝠王之ContentProvider
    Android白眉鹰王之BroadcastReceiver
    Android倚天剑之Notification之亮剑IOS
    Android紫衫龙王之Activity
    GoF23种设计模式之行为型模式之访问者模式
  • 原文地址:https://www.cnblogs.com/hhddcpp/p/4303927.html
Copyright © 2011-2022 走看看