memcpy関数の内部実装
820 ワード
memcpy関数は特に実現しやすいと思っていたが、今日面接に行ってやっと住所の重なりを考えていないことが分かった.
次のような誤記があります.
この書き方はdesとsrcメモリが重なることを考慮しておらず、desとsrcメモリが重なるとsrc+size>desとなり、コピー後のsrcの末尾に新しいメモリdesのヘッダ内容が上書きされます.
正しい書き方を紹介します.
次のような誤記があります.
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;
}