zoukankan      html  css  js  c++  java
  • strcpy和memcpy的差别

    strcpy和memcpy都是标准C库函数。它们有以下的特点。


    strcpy提供了字符串的复制。

    即strcpy仅仅用于字符串复制。而且它不仅复制字符串内容之外,还会复制字符串的结束符,strcpy_s更安全。

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

    返回值是char*是为了链式表达。

    memcpy提供了一般内存的复制。即memcpy对于须要复制的内容没有限制,因此用途更广。
    void *memcpy( void *dest, const void *src, size_t count );

    char *strcpy(char * dest, const char * src) // 实现src到dest的复制
    {
      if ((src==NULL)||(dest == NULL)) //推断參数src和dest的有效性
      {
          return NULL;
      }
      char *strdest=dest;      //保存目标字符串的首地址
      while ((*strDest++ = *strSrc++)!='');//把src字符串的内容拷贝到dest下
      return strdest;
    }

    strcpy_s是strcpy的安全版本号,它之所以安全,是由于其在拷贝字符串的时候会有越界的检查工作。下面是strcpy_s的实现代码,在tcscpy_s.inl文件能够找到:
    參考http://www.cnblogs.com/chenkunyun/archive/2012/03/20/2408365.html

    errno_t __cdecl _FUNC_NAME(_CHAR *_DEST, size_t _SIZE, const _CHAR *_SRC)
    {
        _CHAR *p;
        size_t available;
      
        /* validation section */
        _VALIDATE_STRING(_DEST, _SIZE); //VALIDATE_STRING应该是验证字符串的合法性,是否以null结尾。

        _VALIDATE_POINTER_RESET_STRING(_SRC, _DEST, _SIZE); //__VALIDATE_POINTER_RESET_STRING应该是记录字符串的原始信息,以便拷贝失败以后恢复  
        p = _DEST;
        available = _SIZE;
        while ((*p++ = *_SRC++) != 0 && --available > 0)
        {
        }
      
        if (available == 0)
        {
            _RESET_STRING(_DEST, _SIZE); //
            _RETURN_BUFFER_TOO_SMALL(_DEST, _SIZE); //当目的地空间不够时,会依据_VALIDATE_POINTER_RESET_STRING记录的信息恢复字符串,而且(在Debug模式下)以弹出对话框的形式报告错误。    
        _FILL_STRING(_DEST, _SIZE, _SIZE - available + 1);
        _RETURN_NO_ERROR;
    }

    _FILL_STRING完毕在字符串最后加上null结束符的工作

    void *memcpy(void *memTo,const void *memFrom,size_t size)
    {
      if((memTo==NULL)||(memFrom == NULL)) //memTo和memFrom必须有效
             return NULL;
      char *tempFrom=(char *)memFrom;            //保存memFrom首地址
      char *tempTo=(char *)memTo;                 //保存memTo首地址     
      while(size-->0)               //循环size次,复制memFrom的值到memTo中
             *tempTo++=*tempFrom++ ; 
      return memTo;
    }

    strcpy和memcpy主要有下面3方面的差别。


    1、复制的内容不同。strcpy仅仅能复制字符串,而memcpy能够复制随意内容,比如字符数组、整型、结构体、类等。


    2、复制的方法不同。strcpy不须要指定长度,它遇到被复制字符的串结束符""才结束,所以easy溢出。

    memcpy则是依据其第3个參数决定复制的长度。
    3、用途不同。通常在复制字符串时用strcpy。而须要复制其它类型数据时则一般用memcpy

  • 相关阅读:
    Windows Azure Storage (17) Azure Storage读取访问地域冗余(Read Access – Geo Redundant Storage, RA-GRS)
    SQL Azure (15) SQL Azure 新的规格
    Azure China (5) 管理Azure China Powershell
    Azure China (4) 管理Azure China Storage Account
    Azure China (3) 使用Visual Studio 2013证书发布Cloud Service至Azure China
    Azure China (2) Azure China管理界面初探
    Azure China (1) Azure公有云落地中国
    SQL Azure (14) 将云端SQL Azure中的数据库备份到本地SQL Server
    [New Portal]Windows Azure Virtual Machine (23) 使用Storage Space,提高Virtual Machine磁盘的IOPS
    Android数据库升级、降级、创建(onCreate() onUpgrade() onDowngrade())的注意点
  • 原文地址:https://www.cnblogs.com/yxwkf/p/5424019.html
Copyright © 2011-2022 走看看