zoukankan      html  css  js  c++  java
  • memset,memcpy,strcpy 的区别

    一.函数原型
       strcpy
       extern char *strcpy(char *dest,char *src);
       #include <string.h>
       功能:把src所指由NULL结束的字符串复制到dest所指的数组中
       说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
       返回指向dest的指针

    memcpy
    extern void *memcpy(void *dest,void *src,unsigned int count);
    #include <string.h>
       功能:由src所指内存区域复制count个字符串到dest所指内存区域.
       说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针.
      
       memset
       extern void *memset(void *buffer,int c,int count);
       #include <string.h>
       功能:把buffer所指内存区域的前count个字节设置成字符c
       说明:返回指向buffer的指针.

     

    二.区别
        memset 用来对一段内存空间全部设置为某个字符,一般用于在对定义的字符串初始化为' '或者'\0';
        例: char a[100];
              memset(a,'\0',sizeof(a));
       
       memcpy 是用来做内存拷贝,可以用来拷贝任何数据类型的对象,可以指定拷贝的数据长度;
       例:
               char a[100],b[50];
               memcpy(b,a,sizeof(b));   //注意:如果使用sizeof(a),会造成内存溢出
       mem是一段内存,他的长度,必须自己记住.memcpy是见着什么拷贝什么。
       
        strcpy 就只能拷贝字符串,它遇到'\0'就结束拷贝;
          例:char a[100],b[50];
                  strcpy(a,b);
                  如用strcpy(b,a)要注意a中的字符串长度(第一个'\0'之前) 是否超过50,如果超过,则会造成b的
    内存溢出.它是不会拷贝'\0'的,所以一般还有加一个语句:
                  *a='\0';
      
    三.使用技巧
          memset 可以方便的清空一个数据结构的变量或数组.
          如:
            struct sample_struct
           {
                  char csName[16];
                  int iSeq;
                  int iType;
           };
           对于变量
           struct sample_struct stTest;
           一般情况下,初始化stTest的方法:
            stTest.csName[0]='\0';
            stTest.iSeq=0;
            stTest.iType=0;
        而用memset:
           memset(&stTest,0,sizeof(struct sample_struct));
        如果是数组:
        struct sample_struct TEST[100];
        memset(TEST,0,sizeof(struct sample_struct)*100);

      

     

    strcpy是拷贝字符串,以\0为标志结束(即一旦遇到数据值为0的内存地址拷贝过程即停止)
    strcpy的原型为
    char *strcpy(char *dest, const char *src)
    而memcpy是给定来源和目标后,拷贝指定大小n的内存数据,而不管拷贝的内容是什么(不仅限于字符)
    memcpy的原型为
    void *memcpy(void *dest, const void *src, size_t n);
    作者:张锋
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
    更多精彩文章可以观注
    微信公众号 soft张三丰

    微信交流群,添加群主微信,邀请入群
  • 相关阅读:
    微软“隐形革命”
    关于董事会绩效评估的思考
    Redis源码分析(二十八)--- object创建和释放redisObject对象
    Redis源码分析(二十七)--- rio系统I/O的封装
    Redis源码分析(二十七)--- rio系统I/O的封装
    实战DeviceIoControl 之一:通过API访问设备驱动程序 分类: windows驱动程序WDM 2013-09-25 14:45 381人阅读 评论(0) 收藏
    马云:超过我只需十到十五年
    如何在不同文化背景下做简报
    Google与沃尔玛的薪酬战略—方法不同,目的一致
    传苹果9月9日发布iPhone 6S
  • 原文地址:https://www.cnblogs.com/skyme/p/1931206.html
Copyright © 2011-2022 走看看