2016-04-07 8 views
0

私はmemmoveで遊んでいて、どのように動作するのか理解しています。しかし、最終結果に元のソースサイズよりも多くのものが含まれている場合は常に、一連の乱数が出力されます。たとえば:CのMemmove()が結果を2回出力します

char str[] = "abcdefgh"; 
memmove(str + 6, str + 3, 4); 
printf("%s\n", str); 

は私に他の文字がstrの中に加えられているなぜそれが私に abcdefdefgを与える必要があり、出力abcdefdefgbdefgghを与えますか?

+7

バッファの最後を過ぎて書き込みました。これにより未定義の動作が発生します。あなたは 'printf("%s "'を文字列ではないもので使用しましたが、これも未定義の動作を引き起こします。 –

答えて

0
memmove(void *destination, void *source, size_t bytesToCopy) 

文字列に追加されるその他の文字は、宣言されたchar str []のメモリ位置を超える文字です。 memmoveのバッファアドレスを超え、 '\ 0'の終了文字が上書きされました。したがって、printfを呼び出すと、関数は '\ 0'に出会うまでポインターが参照する文字を出力し続けます。 strため

0

メモリが見えます:

'a','b','c','d','e','f','g','h',0x0,?,?,? 
           ^
          End of buffer (terminates the string) 

あなたは

'a','b','c','d','e','f','d','e','f','g',?,? 
           ^
          End of buffer 

を与えるインデックス6のインデックス3から4バイトですから、

A)(文字列の終了を上書きしているコピー0x0)を 'f'で指定します。

b)バッファの外側に書き込まれます(つまり 'g')wh ichは本当に悪いです

のために、文字列終了がなくなったので、strを印刷すると奇妙な結果になるでしょう。

関連する問題