$
バッファー間でバイトをコピーします。 これらの関数のセキュリティを強化したバージョンを使用できます。「memcpy_s
、wmemcpy_s
」を参照してください。
構文
void *memcpy(
void *dest,
const void *src,
size_t count
);
wchar_t *wmemcpy(
wchar_t *dest,
const wchar_t *src,
size_t count
);
パラメーター
dest
コピー先のバッファー。
src
コピー元のバッファー。
count
コピーする文字数。
戻り値
dest
の値。
解説
memcpy
は、count
から src
に dest
バイトをコピーし、wmemcpy
は count
個のワイド文字をコピーします。 コピー元とコピー先の領域が重なり合う場合の memcpy
の動作は未定義です。 重なり合う領域を処理するには、memmove
を使用します。
重要
コピー先のバッファーが、コピー対象の文字数を収容できる十分な大きさであることを確認します。 詳細については、「バッファー オーバーランの回避」を参照してください。
重要
memcpy
の不適切な使用に由来するバッファー オーバーランと、それに伴う潜在的なセキュリティの脆弱性が多数生じているため、この関数は、セキュリティ開発ライフ サイクル (SDL) で「禁止」関数に挙げられています。 一部の VC++ ライブラリ クラスが memcpy
を使用し続けていることにお気付きかもしれません。 さらに、VC++ コンパイラ オプティマイザーが memcpy
への呼び出しを生成する場合があることにもお気付きかもしれません。 Visual C++ 製品は SDL のプロセスに従って開発されているため、この禁止関数の利用は綿密に評価されてきました。 ライブラリがこれを使用する場合、これらの呼び出しによってバッファー オーバーランが許可されないよう、慎重に調査されてきました。 コンパイラの場合、時折、特定のコード パターンが memcpy
のパターンと同一であると認識されて、この関数の呼び出しに置き換えられることがあります。 そのような場合は、memcpy
を利用しても、元の手順と比べて安全性は変わらないため、パフォーマンスが調整された memcpy
関数の呼び出しを使用するように最適化されます。 「安全」な CRT 関数を使用しても安全性が保証されるわけではない (安全でない状態になりにくいということに過ぎない) ように、「禁止された」関数を使用しても、危険であると保証されるわけではありません (安全性を保障するのに、より大きな監視が必要になるに過ぎません)。
VC++ コンパイラとライブラリによる memcpy
の使用は注意深く調査されているため、他の面では SDL に準拠しているコード内でその呼び出しを使用することが許可されています。 アプリケーションのソース コードで memcpy
の呼び出しを使用した場合は、セキュリティの専門家による確認を受けない限り、SDL 準拠になりません。
次の例に示すように、memcpy
および wmemcpy
関数は、#include
ステートメントの前に定数 _CRT_SECURE_DEPRECATE_MEMORY
が定義されている場合にのみ非推奨になります。
#define _CRT_SECURE_DEPRECATE_MEMORY
#include <memory.h>
または
#define _CRT_SECURE_DEPRECATE_MEMORY
#include <wchar.h>
要件
ルーチンによって返される値 | 必須ヘッダー |
---|---|
memcpy |
<memory.h> または <string.h> |
wmemcpy |
<wchar.h> |
互換性の詳細については、「 Compatibility」を参照してください。
例
memcpy
の使用方法の例については、「memmove
」を参照してください。