strcpyとmemcpy


81

違いは何であるmemcpy()とはstrcpy()?私はプログラムの助けを借りてそれを見つけようとしましたが、両方とも同じ出力を与えています。

出力


回答:


128

この効果を見るために何ができるか

このコードをコンパイルして実行します。

次の出力が生成されます。

「ch」はによってコピーされたがmemcpy()、ではコピーされていないことがわかりstrcpy()ます。


1
こんにちは、投稿が古いことは知っていますが、2つの質問があります。まずprintf("%2.2x ", *p);---なぜprintfを2.2に制限したのですか?その上、ドットがまったく見えprintf("%c", *p ? *p : ' ');ません...次に---このテストは実際に何をチェックしますか?もし*p?よろしくお願いします!
Peter Cerba 2012

14
printfステートメントでは、「x」は「ベース16」を意味します。「2.2」とは、2桁のみを意味します。*pテスト手段:「あなたがnullをヒットした場合、スペースを印刷します。」
egrunin 2012

86

strcpyNUL('\0')文字に遭遇すると停止しますが、停止memcpyしません。%sprintfもNULで停止するため、ここでは効果はわかりません。


2
@Sachin:初期化ptて何か(たとえば、すべて空白)にし、コピーした後、と比較p[3]t[3]ます。strcpy行かなかった超えてp[2]、それがヌル文字を見つけました、が、memcpyコピーされた指示通りに5つの文字。
カスカベル2010年

9
マイナーな選択:strcpyは、NUL文字(1つの「L」)に遭遇すると停止します。NULL(2つの「L」)は、有効なオブジェクトを指さないことが保証されているポインターのコンパイル時定数です。
ダニエルスタッツバッハ2010年

destとsrcが重複している場合、strcpyはセグメンテーション違反をスローしますか?
アルコット2011

12

strcpyソース文字列のヌルターミネータが見つかると終了します。memcpyサイズパラメータを渡す必要があります。提示した場合printf、両方の文字配列でnullターミネータが見つかった後、ステートメントは停止しますが、それらの中にデータも見つかりt[3]t[4]コピーされています。


9

strcpy ソースでNULLまたは「\ 0」文字が見つかるまで、ソースから宛先に文字を1つずつコピーします。

ここで、asmemcpyは、ソース内のデータに関係なく、指定されたサイズnのソースから宛先にデータ(文字ではない)をコピーします。

memcpyソースに文字以外が含まれていることがよくわかっている場合に使用する必要があります。暗号化されたデータまたはバイナリデータの場合、memcpyが理想的な方法です。

strcpyは非推奨なので、を使用してくださいstrncpy


3

s文字列にヌル文字が含まれているため、はprintfそれ以上の文字は表示されません。違いpt文字4と5になりますがpいずれかを持っていません(彼らはゴミになるだろう)とtなります'c''h'


2
  • 動作の違い:strcpyに遭遇すると停止しますNULLまたは'\0'
  • パフォーマンスの違い:memcpy通常strcpy、コピーするデータを常にスキャンするよりも効率的です

2

主な違いは、memcpy()指定した正確なバイト数を常にコピーすることです。strcpy()一方、は、NUL(別名0)バイトを読み取るまでコピーし、その後停止します。


1

テストプログラムの問題は、null終了に遭遇printf()すると、引数の挿入を停止することです。したがって、出力では、おそらく気づかなかったでしょう。それは文字もコピーしたものです。%s\0memcpy()ch

私はGNUglibc-2.24で、(x86の場合)strcpy()単にを呼び出すことを見てきましたmemcpy(dest, src, strlen(src) + 1)


0

printf("%s",...) nullが検出されるとデータの印刷を停止するため、両方の出力は同じです。

次のコードは、区別strcpyしてmemcpy

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.