zoukankan      html  css  js  c++  java
  • strcpy, mencpy, memmove三者区别

    首先来看strcpy,目的是实现字符串的复制,这里需要注意几个点:

    1.判断指针的有效性

    2.将复制后的指针地址返回,为了支持链式操作

    3.不要忘记将字符串最后一个自负''复制给dest

    4.注意原字符串类型为const,保证在函数内部不会被修改

    char* myStrcpy(char* dest, const char* src){
        assert(dest!=NULL && src !=NULL);
        char* r = dest;
        while((*dest++ = *src++)!='') ;
        return r;
    }

    然后来看memcpy,目的是实现内存的复制,这里就不仅仅限制于字符串复制,并且规定了复制内存的大小

    void* myMemcpy(void* dest, const void* src, size_t n){
        assert(dest!=NULL && src !=NULL);
        void* r = dest;
        while(n--){
            *dest++ = *src++;
        }
        return r;
    }

     最后来看memmove,实现的功能,与mencpy是一样的,不同的地方在于,其处理了目的内存与原内存重叠的情况。

    void* myMemmove(void* dest, const void* src, size_t n){
        assert(dest!=NULL&& src!=NULL);
        void* r = dest;
        if(dest<src || dest>str+n){   //no recover
            while(n--){
                *dest++ = *src++;
            }
        }else{   // with recover, copy from end to begin
            dest = dest+n;
            src = src + n;
            while(n--){
                *(--dest) = *(--src);
            }
        }
        return r;
    }

    总体看来,strcpy, memcpy和memmove都是对内存进行复制操作的,不同之处在于,strcpy强调对于字符串的处理,memcpy要给定复制内容的大小,memmove则注意了内存重叠的情况

  • 相关阅读:
    《Flutter实战入门》下拉刷新组件的使用方法
    百度HTTPS认证失败解决方法
    unity踩过的音频坑
    如何解决flutter中gradle慢的问题
    如何在ubuntu里面关掉后台的meteor
    ruby生成随机成绩
    Gemfile分平台加载gem
    sublime text2在windows中以命令行启动
    右键添加 CMD 命令提示符
    修复sublime text系统右键菜单
  • 原文地址:https://www.cnblogs.com/xiamaogeng/p/4462009.html
Copyright © 2011-2022 走看看