文字列コピー(strcpyとmemcpy)

5633 ワード

strcpy
char * strcpy ( char * destination, const char * source );

戻り値:destination
memcpy
void * memcpy ( void * destination, const void * source, size_t num );

c実装(メモリが重なる場合を考慮):
void* my_memcpy(void* dst, const void* src, size_t len) {
  if(dst==NULL || src==NULL) return NULL;
  if(src<dst && dst<src+len) {  //  ,      
    char* pdst = (char*)dst + len-1;
    char* psrc = (char*)src + len-1;
    while(len--) {
      *pdst = *psrc;
      pdst--;
      psrc--;
    }
  }
  else {  //      
    char* pdst = (char*)dst;
    char* psrc = (char*)src;
    while(len--) {
      *pdst = *psrc;
      pdst++;
      psrc++;
    }
  }
  return dst;
}

注意:任意のタイプのポインタでvoid*ポインタを初期化できますが、void*ポインタを他のタイプに割り当てる場合は、上記のようにタイプ変換を強制します.