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++)!='\0');//把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不需要指定長度,它遇到被複制字符的串結束符"\0"才結束,所以容易溢出。memcpy則是根據其第3個參數決定複製的長度。
3、用途不同。通常在複製字符串時用strcpy,而需要複製其他類型數據時則一般用memcpy

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章