进来很多面试题都会考到strcpy和memcpy的实现,所以在学习之余我将其做一整理:
1,首先是memcpy:
void* memcpy(void *dst, const void *src, size_t count)
{
//安全检查
assert( (dst != NULL) && (src != NULL) );
unsigned char *pdst = (unsigned char *)dst;
const unsigned char *psrc = (const unsigned char *)src;
//防止内存重复
assert(!(psrc<=pdst && pdst<psrc+count));
assert(!(pdst<=psrc && psrc<pdst+count));
while(count--)
{
*pdst = *psrc;
pdst++;
psrc++;
}
return dst;
}
请注意:void指针可以就受任何类型,但是将void指针赋值给其它变量时必须进行类型转换如上,上面问题中的唯一陷阱就是 地址重复。
2,strcpy,strcpy比较简单,在程序中我们省去断言。下面给出四种大家看看那个不正确。
void strcpy1(char *s,char *t)
{
while((*s++ = *t++) != '\0');
}
void strcpy2(char *s,char *t)
{
while(*s++ = *t++);
}
void strcpy3(char *s,char *t)
{
while(*t)
{
*s = *t;
s++;
t++;
}
}
void strcpy4(char *s, char *t)
{
while( *s = *t )
{
s++;
t++;
}
}
其中
strcpy3有问题,你看出来了吗??