(1) Memset
  原型:   extern void *memset(void *buffer, int c, int count);              
  用法:  #include <string.h>

功能: 把buffer所指内存区域的前count个字节设置成字符 c。           
  说明: 返回指向buffer的指针。用来对一段内存空间全部设置为某个字符
              例如:     
                    char a[10];                         
                    memset(a, '\0', sizeof(a));                
        memset可以方便的清空一个结构类型的变量或数组。               
             如:struct    _test{  char s[10];      
                                          int x;      
                                          int y;
                                        };        
    变量     struct _test    st;              
(1)一般清空st的方法如下: 
st.s[0] = '\0'; st.x =0;   st.y =0;               
(2) 用memset方法如下:                
             memset(&st,0,sizeof(struct _test));         
    数组:  struct _test     st[10];                
  memset(st,0,sizeof(struct _test)*10);  //清空方法 
//memset 源码的实现 C语言
#include <mem.h> 
void* memset(void* s, int c, size_t n)
{
     unsigned char* p = (unsigned char*) s;
     while (n > 0) 
       {
               *p++ = (unsigned char) c;
                --n;
       }
      return s;
  }

(2)memcpy
原型:extern void *memcpy(void*dest,void*src,unsignedintcount);              用法: #include <string.h>              
功能: 由src所指内存区域复制count个字节到dest所指内存区域。             
说明: src和dest所指内存区域不能重叠,函数返回指向dest的指针.可以拿它拷贝任何数据类型的对象。    
             例如:  char a[10],b[5];              
                        memcpy(b, a, sizeof(b));             /*注意如果用sizeof(a),会造成b的内存地址溢出*/
(3) Strcpy   
    原型: extern char *strcpy(char *dest,char *src);                   
    用法: #include <string.h>                    
    功能: 把src所指由NULL结束的字符串复制到dest所指的数组中。               
    说明: src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳 src的字符串.返回指向dest的指针。                    
               例如:   char a[100],b[50];
                          strcpy(a,b);
                 如用   strcpy(b,a); 
  要注意a中的字符串长度(第一个‘\0’之前)是否超过50位,如超过,则会造成b的内存地址溢出。
    假如有如下代码,请问输出为多少?
            #include "stdio.h"
            main()
                {  char dest[3];
                    char str[6]="Hello";
               strcpy(dest,str); 
                    printf("%s\n",dest);
              }
        编译输出如下结果:
        Hello                  //没有输出乱码,有点怪怪的为什么?
       分析:
             1>str中字符串的长度大于dest 的内存长度3.为什么str字符串还能完拷贝到dest 中呢?
      来看看 strcpy的 源代码实现:
char   *strcpy(char   *strDest,const   char   *strSrc)   
{   
        assert((strDest!=NULL)&&(strSrc   !=NULL))   //判断指针是否合法,即分配内存,指向某块确定区域
        char   *address   =   strDest;               //记住目标地址的起始值
        while((*strDest++   =   *strSrc++)!='\0')   //先拷贝,后判断,这样就不用在拷贝完了后,再加一句
              NULL;                   // *strDest = '\0'; -->即加一个结束符.因为字符串结束已拷贝了.
              return   address;      //返回目标首地址的值。             
               }
        //从上面的代码可以看出,strcpy函数,假定strDest的内存空间是足够可以放下strSrc的内容的.
        //也就是说使用者,在使用strcpy函数时,应使 (strDest内存空间)>=  (strSrc内存空间)     
        // 在调用   strcpy(dest,str);  时,while((*strDest++   =   *strSrc++)!='\0')   没有判断strDest的内存是否够,而是将srtSrc的内容直接拷贝到strDest,当拷到'\0'就结束.
        //因此在使用printf("%s\n",dest);  时 输出遇到'\0'时停此输出.所以会输出: Hello

(4) 三者区别                     
           memset   主要应用是初始化某个内存空间。                  
           memcpy   是用于copy源空间的数据到目的空间中。                  
           strcpy   用于字符串copy,遇到‘\0’,将结束。                  
如果理解了这些,就能知道它们的区别:                 
       例如初始化某块空间的时候,用到memcpy,那么就显得笨拙                 
    int    m[100]                      
memset((void*)m,0x00,sizeof(int*100);             //Ok!                     
memcpy((void*)m,"\0\0\0\0....",sizeof(int)*100);    //Not Ok
一.函数原型    
    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);

转载于:https://www.cnblogs.com/wenxp2006/archive/2012/05/15/2500856.html

Memset、Memcpy、Strcpy 的作用和区别(转)相关推荐

  1. memset,memcpy,strcpy 的区别

    一.函数原型 strcpy extern char *strcpy(char *dest,char *src); #include <string.h> 功能:把src所指由NULL结束的 ...

  2. strcpy和strncpy区别 memcpy strcpy strncpy lstrcpy lstrncpy wstrcpy, memmove

    strcpy和strncpy区别(2009-04-27 15:48:52) 转载标签:杂谈 分类:C++/C 第一种情况: char* p="how are you ?"; cha ...

  3. strcpy和memcpy的区别 | strcpy和strncpy的区别

    strcpy和memcpy都是标准C库函数,它们有下面的特点. strcpy提供了字符串的复制.即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符. 已知strcpy ...

  4. C语言 strcpy 和 strcpy_s 函数区别 - C语言零基础入门教程

    目录 一.strcpy_s 函数/strcpy 函数简介 1.strcpy 函数语法 2.strcpy_s 函数语法 二.strcpy/strcpy_s 函数实战 三.猜你喜欢 零基础 C/C++ 学 ...

  5. Spring中SmartLifecycle和Lifecycle的作用和区别

    欢迎关注方志朋的博客,回复"666"获面试宝典 本文基于SpringBoot 2.5.0-M2讲解Spring中Lifecycle和SmartLifecycle的作用和区别,以及如 ...

  6. ANDROID 中UID与PID的作用与区别

    ANDROID 中UID与PID的作用与区别 PID:为Process Identifier, PID就是各进程的身份标识,程序一运行系统就会自动分配给进程一个独一无二的PID.进程中止后PID被系统 ...

  7. (转)从一道面试题彻底搞懂hashCode与equals的作用与区别及应当注意的细节

    背景:学习java的基础知识,每次回顾,总会有不同的认识.该文系转载 最近去面试了几家公司,被问到hashCode的作用,虽然回答出来了,但是自己还是对hashCode和equals的作用一知半解的, ...

  8. python类方法中使用:修饰符@staticmethod和@classmethod的作用与区别,还有装饰器@property的使用

    python类方法中使用:修饰符@staticmethod和@classmethod的作用与区别,还有装饰器@property的使用(3-20181205) 文章目录: 一. @staticmetho ...

  9. Jar/War/Ear等包的作用与区别详解

    Jar/War/Ear等包的作用与区别详解 以客户角度来看,jar文件就是一种封装格式,用户不需要知道jar包中有多少个.class格式的文件及每个文件中的功能与作用,也可以得到相应的访问的结果.ja ...

  10. java ear war_[转] 基于Java的打包jar、war、ear包的作用与区别详解

    以最终客户的角度来看,JAR文件就是一种封装,他们不需要知道jar文件中有多少个.class文件,每个文件中的功能与作用,同样可以得到他们希望的结果.除jar以外对于J2EE来说还有war和ear.区 ...

最新文章

  1. python导出csv不带引号的句子_python csv writer在不需要时添加引号
  2. troch3d open3d例子
  3. Python3 文件操作
  4. 【java】强悍!Java 9 中的9个新特性
  5. 基于matlab的电力系统输电仿真,基于MATLAB电力系统线路运行的仿真与分析
  6. JavaScript经纬度和地图坐标相互转换
  7. Java 标识符的命名规则与规范
  8. 求2+22+222+2222+22222
  9. python数据分析与可视化答案学堂云_智慧树知到_Python数据分析与数据可视化_最新答案...
  10. shareSDK导入的常见错误及解决方法
  11. [文献解读#4] 肿瘤抗原与肠道噬菌体之间的免疫交叉反应
  12. 星际争霸秘籍 星际争霸补丁
  13. CAD图案填充:什么是CAD线图案?
  14. 计算机专业大几用到移动硬盘,2T有轻薄,4T大容量,双盘在面前,你会怎么选?—希捷2T移动硬盘评测...
  15. [Unity优化]减少顶点数目
  16. Linux虚拟机扩展文件系统
  17. Dae-Da-Lus小组idea集锦
  18. VS Code软妹音程序员鼓励师插件安装
  19. 在智能建筑中设置照明控制以驱动收敛的物联网移动
  20. 京东渴望做大“宠物梦”

热门文章

  1. Kubernetes 小白学习笔记(9)--搭建一个kubernetes集群--安装Ubuntu虚拟机和容器docker
  2. Kubernetes 小白学习笔记(7)--kubernetes的架构与组件-Node组件
  3. java双向链表结构_【Java数据结构】2.3双向链表的迭代实现
  4. 设计模式之GOF23外观模式
  5. 阶段3 2.Spring_10.Spring中事务控制_11 spring5新特性的介绍
  6. 阶段1 语言基础+高级_1-3-Java语言高级_07-网络编程_第1节 网络通信概述_4_IP地址...
  7. Activityn 生命周期
  8. 根据输入时间判断年龄是否在18~68周岁之间
  9. Gym 100342E Minima (暴力,单调队列)
  10. SQL Server 列存储索引强化