strcpy、memcpy、memmove的区别

    xiaoxiao2021-03-25  114

    strcpy和memcpy都是标准C库函数,它们有下面特点:

    strcpy提供了字符串的复制。即strcpy只用于字符串复制,并且它不仅复制字符串内容外,还会复制字符串的结束符。

    strcpy的函数原型是:char* strcpy(char* dest, const char* src);

     

    memcpy只提供一般的内存复制,即memcpy对于需要复制的内容没有限制,因此用途更广。

    memcpy的函数原型是:void *memcpy(void *dest,  const char* src,  size_t count);

     

     1  char *strcpy( char *dest,  const  char *src)  2 {  3      if((src == NULL) || (dest == NULL))  4     {  5           return NULL;  6     }  7   8      char *strdest = dest;  //  保存目标字符串的首地址  9       while((*dest++ = *str) !=  ' \0 '); 10      return strdest; 11 }

     

     

    void *memcpy( void *memTo,  const  char *memFrom, size_t size) {       if((memTo == NULL) || (memFrom == NULL))      {            return NULL;      }       char *tempFrom = ( char *)memFrom;  // 保存memFrom的首地址       char *tempTo = ( char *)memTo;  // 保存memTo的首地址        while(size-- >  0)      {           *tempTo++ = *tempFrom++;      }       return memTo; }

     

    strcpy 和 memcpy主要有以下三方面的区别:

    1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符串、整型、结构体、类等。

    2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符串的结束符"\0”才结束,所以容易溢出。memcpy则是根据第3个参数决定复制的长度。

    3、用途不同。通常在复制字符串时用strcpy,而需要复制其它类型的数据是用memcpy。

     

    memcpy 和 memmove 都是C语言中的库函数,在库函数 string.h中,其原型相似,它们都是从src所指向的内存中复制count个字节到dest所指内存中。并返回dest的值。

    当源内存区域 和 目标内存区域无交叉重叠时,两者的结果是一样的,但如果有交叉呢?

    memcpy是从src的其实部分开始复制,所以虽然第一种情况下没有问题,但如果遇到第二种情况,则会发生错误,交叉部分的src内容就会被覆盖掉了。

    而memmove则由于采用不同的复制机制,所以可以正确处理第二种情况。

     

     

    void *memmove( void *dst, const  void *src, int n) {       char *dp = ( char *)dst;       char *sp = ( char *)src;       assert((src!= 0)&&(dst!= 0)&&(n> 0)); // not null        // 非重叠         // dp < sp        // dp > (sp+n)       if(sp>dp||(sp+n)<dp)      {            while(n--)               *(dp++) = *(sp++);          *dp =  ' \0 ';      }       else  if(sp<dp) // 重叠 (此时条件 sp<dp<(sp+n))如果sp==dp则快速的返回      { // 反向拷贝             sp += n;           dp += n;           *dp =  ' \0 ';            while(n--)             *(--dp) = *(--sp);       }       return dst; }       
    转载请注明原文地址: https://ju.6miu.com/read-8480.html

    最新回复(0)