天天看点

memset及memcpy实现

原型: void *memset(void *buffer, int c, int count);

用法:#include <string.h>

功能:把buffer所指内存区域的前count个字节设置成字符c。

说明:返回指向buffer的指针。

源码实现:

void *memset(void *src, int c, size_t count)

{

 assert(src!=NULL);

 char *tmpsrc=(char*)src;

 while(count--)

  *tmpsrc++ =(char)c;

 return src;

}

实现1:《高质量c++,c编程指南》

[cpp]  view plain copy

  1. void *mymemcpy(void *dst,const void *src,size_t num)  
  2. {  
  3.     assert((dst!=NULL)&&(src!=NULL));  
  4.           //assert(des>=src+num||src>dst+num);  
  5.     byte * psrc = (byte *)src;//byte 既为unsigned char类型  
  6.     byte * pdst = (byte *)dst;  
  7.     while(num-->0)*pdst++ = *psrc++;  
  8.     return dst;  
  9. }  

缺点:没有考虑内存重叠的情况,可以加一个断言换为:assert(des>=src+num||src>dst+num);

实现2:考虑重叠,有重叠情况也复制

[cpp]  view plain copy

  1. void * mymemcpy(void *dest, const void *src, size_t count)  
  2. {  
  3.     if (dest == NULL || src == NULL)  
  4.           return NULL;  
  5.     char *pdest = static_cast <char*>(dest);  
  6.     const char *psrc  = static_cast <const char*>(psrc);  
  7.     int n = count;  
  8.     if (pdest > psrc && pdest < psrc+count)  
  9.     {  
  10.         for (size_t i=n-1; i != -1; --i)  
  11.         {  
  12.                 pdest[i] = psrc[i];  
  13.         }  
  14.     }  
  15.     else  
  16.     {  
  17.         for (size_t i= 0; i < n; i++)  
  18.         {  
  19.                 pdest[i] = psrc[i];  
  20.         }  
  21.     }  
  22.     return dest;  
  23. }