百度面接問題——C言語で関数void*memmove(void*dest,const void*src,size_t n)を実現する
783 ワード
この関数はC/C++標準ライブラリ関数に存在し、srcが指すnバイトのデータをdest位置にコピーするために使用されます.標準ライブラリ関数には、メモリコピーを実装するためにも使用される別の関数memcpyもありますが、区間重複の問題は考慮されず、コピー中に重複エラーが発生する可能性があります.
memmoveは、コピーエラーを防止するために、控訴問題に対して一定の処理措置を与えた.
(1)ソースメモリの先頭アドレスがターゲットメモリの先頭アドレスに等しい場合、何のコピーも行わない
(2)ソースメモリの先頭アドレスがターゲットメモリの先頭アドレスより大きい場合、順方向コピーを実行する
(3)ソースメモリのヘッダアドレスがターゲットメモリのヘッダアドレスより小さい場合、逆コピーを実行し、次にmemmoveの具体的な実装を示し、memcpyについてはライブラリ関数実装または関連資料を参照することができる.
memmoveは、コピーエラーを防止するために、控訴問題に対して一定の処理措置を与えた.
(1)ソースメモリの先頭アドレスがターゲットメモリの先頭アドレスに等しい場合、何のコピーも行わない
(2)ソースメモリの先頭アドレスがターゲットメモリの先頭アドレスより大きい場合、順方向コピーを実行する
(3)ソースメモリのヘッダアドレスがターゲットメモリのヘッダアドレスより小さい場合、逆コピーを実行し、次にmemmoveの具体的な実装を示し、memcpyについてはライブラリ関数実装または関連資料を参照することができる.
void *memmove(void *dest,const void *src, size_t n)
{
if (NULL == dest || src == NULL)
{
cerr< (char *)dest) {
step = 1;
p = (char *)src;
q = (char *)dest;
} else {
step = -1;
p = (char *)src + n - 1;
q = (char *)dest + n - 1;
}
for(int i = 0; i != n; ++i) {
*q = *p;
p += step;
q += step;
}
return dest;
}