strcpy, memcpy, memmove, memset的实现

strcpy() 字符串拷贝

 

char *strcpy(char *strDest, const char *strSrc)
{
    assert((strDest!=NULL) && (strSrc !=NULL));
    char *address = strDest;     
    while( (*strDest++ = * strSrc++) != '\0'); 
    return address ;       
}

 

 

memcpy 拷贝不重叠的内存块 

 

void *memcpy(void* pvTo, void* pvFrom, size_t size) //byte是java里的变量类型
{
    assert(pvTo != NULL && pvFrom != NULL);
    byte* pbTo = (byte*)pvTo;
    byte* pbFrom = (byte*)pvFrom;
    /* 内存块重叠吗?如果重叠,就使用memmove */
    assert(pbTo>=pbFrom+size || pbFrom>=pbTo+size);
    while(size-->0)
        *pbTo++ == *pbFrom++;
    return pvTo;
}

 

 

memmove 可拷贝重叠的内存块

 

void* memmove(void *dest, const void *src,size_t n) 
{ 
    if (n == 0) return 0; 
    if (dest == NULL) return 0; 
    if (src == NULL)    return 0; 
    char *psrc = (char*)src; 
    char *pdest = (char*)dest; 
    if((dest <= psrc) || (pdest >= psrc + n)) /*检查是否有重叠问题 */ 
    { 
         for(int i=0; i < n; i++) /*正向拷贝*/ 
         { 
              *pdest = *psrc; 
               psrc++; 
               pdest++; 
         } 
    } 
    else /*反向拷贝*/ 
    { 
        psrc += n; 
        pdest += n; 
        for(int i=0;i<n;i++) 
        { 
            psrc--; 
            pdest--; 
            *pdest = *psrc; 
        } 
    } 
    return dest;
}
 

memset 把buffer所指内存区域的前count个字节设置成字符c void * memset(void* buffer, int c, int count)
{
    char* pvTo=(char*)buffer;
    assert(buffer != NULL);
    while(count-->0)
    *pvTo++=(char)c;
    return buffer;
}

你可能感兴趣的:(memcpy,memset,memmove,strcpy)