memset /memcpy /strcpy函数的使用与区别

 (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;
  }
文章出处:http://www.diybl.com/course/3_program/c/c_js/2008611/124630.html

 

  (2)memcpy

            原型:  extern void *memcpy(void *dest, void *src, unsigned int count);             

             用法: #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);

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值