/**********************************************************
公司考试这种题目主要考你编写的代码是否考虑到各种情况,是否安全(不会溢出)各种情况包括:1、参数是指针,检查指针是否有效2、检查复制的源目标和目的地是否为同一个,若为同一个,则直接跳出3、读写权限检查4、安全检查,是否会溢出
**********************************************************/
/* 功能:由src所指内存区域复制count个字节到dest所指内存区域。
说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针。*/
void* memcpy(void* dst,const void* src,size_t count)
{
char* pbTo = (char*)dst;
char* pbFrom = (char*)src;
assert(dst!= NULL && src != NULL);//不能存在空指针
assert(pbTo >= pbFrom+count || pbFrom >= pbTo + count);//防止内存重叠(overlap)
while (count-- > 0)
{
*pbTo++ = *pbFrom++;
}
return dst;
}
/* 功能:把src所指由NULL结束的字符串复制到dest所指的数组中。 说明:src和dest所指
内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。返回指向dest的指针。*/
char* strcpy(char* dest, const char* src)
{
assert(dest != NULL && src != NULL);
char* address=dest;
while((*dest++=*src++) != '\0')
{}
return address;
}
/* 功能:把buffer所指内存区域的前count个字节设置成字符c。
说明:返回指向buffer的指针。*/
void* memset(void* buffer, int c, int count)
{
char* pvTo=(char*)buffer;
assert(buffer != NULL);
while(count-->0)
{
*pvTo++=(char)c;
}
return buffer;
}
/*
memmove自定义函数
*/
//src可以不保留
void* memmove(void* dst,const void* src,size_t count)
{
char* pbTo = (char*)dst;
char* pbFrom = (char*)src;
assert(dst != NULL && src != NULL);//不能存在空指针
if (dst <= src || pbTo >= pbFrom + count)//没有overlap的情况,直接拷贝
{
while (count-- > 0)
{
*pbTo++ = *pbFrom++;
}
}
else
{
pbTo = pbTo + count -1;//overlap的情况,从高位地址向低位拷贝
pbFrom = pbFrom + count -1;
while (count-- > 0)
{
*pbTo-- = *pbFrom--;
}
}
return dst;
}