2011-10-29 3 views
1

これは素晴らしい場所のようです。私の質問は、memmove()のこの実装でどのような価値(または何バイト)が動いているのでしょうか?C - memmove()関数 - この実装では何バイト移動しますか?

int main() 
{ 
char str[] = "memmove can be very useful......"; 
memmove (str+15,str+20,/*?*/); 
puts (str); 
return 0; 
} 

次の例では、11バイト移動しています。しかし、それは11バイトになるのですか?誰かが説明できますか?

int main() 
{ 
char str[] = "memmove can be very useful......"; 
memmove (str+20,str+15,11); //source and destination are reversed 
puts (str); 
return 0; 
} 

ありがとうございます!

編集:BTW、文字列の長さは、終端ヌル文字を含む33です。

+1

'int main()'は 'int main(void)'でなければなりません。もっと重要なことに、 '#include 'と '#include 'が必要です。あなたのコンパイラがこれについてあなたに警告しなかった場合は、警告レベルまでクランクを上げてください。 –

+0

私たちが見せているのは「memmove()」の実装ではなく、単にmemmove()を呼び出すプログラムです。 'memmove()'の*実装*は、実際にバイトをコピーするランタイムライブラリのコードになります。 –

+0

11は11バイトにします。ダー。最初の例では、/ *?* /の代わりに数字を置くまで何も移動していません。あなたはstrcpyとmemmoveを混同していますか? –

答えて

0

(MEMMOVEする最後の引数)が移動するバイト数である - あなたの第二の例では、あなたが11のバイトを移動するので、この場合にはmemmoveの11

+0

@Keith Thompson最初の例で何バイトが必要であるか知っていますか? –

+0

@Mikemmm:何をしようとしていますか? –

+0

@Keith Thompson私は、配列の要素を左にシフトしようとしています。最初の要素を上書きし、それに右のすべての要素を上書きします。キューからの削除のようなもの。 –

1

第三のパラメータは、移動するバイト数を指定します。 memmoveを呼び出す行に構文エラーがあるため、最初の例はコンパイルしないでください。

0

第3パラメータは、コピーするバイト数を定義します。最初の例では、コピーするバイト数を定義する必要があります。

+0

が間違っています。 'str + 15'は'&str [15] 'と同じです。どちらの式も 'char *'型です。 –

+0

私は編集後に私のdownvoteを削除しましたが(これはまだ他の回答と重複しています)。 –

+0

@Surootはい、どれくらいコピーするべきか分かりません。 –