memcpy関数の内部実装

820 ワード

memcpy関数は特に実現しやすいと思っていたが、今日面接に行ってやっと住所の重なりを考えていないことが分かった.
次のような誤記があります.
void *mymemcpy(void *des, void *src, int size)
{
	char *destion=des;
	char *source=src;
	while (size-->0)
	{
		*destion++=*source++;
	}
	return des;
}

この書き方はdesとsrcメモリが重なることを考慮しておらず、desとsrcメモリが重なるとsrc+size>desとなり、コピー後のsrcの末尾に新しいメモリdesのヘッダ内容が上書きされます.
正しい書き方を紹介します.
void *mymemcpy(void *des, void *src, int size)
{
	char *destion=des;
	char *source=src;
	if (destion<=source || destion>=source+size)        //        , des<=src   des>=src+size            des     
	{
		while(size-->0)
		{
			*destion++=*source++;
		}
	}
	else								//  src+size0)
		{
			*destion--=*source--;
		}
	}
	return des;
}