Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C/C++のmemcpy()関数の使い方と実例解説

この記事では、C++ STLにおけるmemcpy()関数の動作、構文、および具体的な使用例について詳しく解説します。

memcpy()とは?

memcpy()関数は、C++ STLに組み込まれた標準関数の一つで、<cstring>ヘッダーファイルで定義されています。この関数はメモリブロックをコピーするために使用され、あるメモリ位置から別のメモリ位置へ、指定されたバイト数分のデータを転送します。

関数の実行結果は、データのバイナリコピーとなります。重要な点として、memcpy()は終端のNULL文字やその他の終端記号をチェックしません。単純にソースから指定されたバイト数(num)をそのままコピーするだけです。

構文

void memcpy( void* destination, void* source, size_t num);

パラメータ

この関数は、以下のパラメータを受け取ります。

  • destination − コピーしたデータを格納するコピー先のメモリ位置へのポインタです。
  • source − コピー元となる入力データ(文字列など)へのポインタです。
  • num − コピーするバイト数を指定します。

戻り値

この関数は、データのコピー先であるdestinationへのポインタを返します。

使用例

入力

char str_1[10] = "Tutorials";
char str_2[10] = "Point";
memcpy (str_1, str_2, sizeof(str_2));

出力

string str_1 before using memcpy
Tutorials
string str_1 after using memcpy
Point

サンプルコード

以下は、memcpy()関数を使って文字列をコピーする完全なプログラム例です。

#include <stdio.h>
#include <string.h>
int main (){
   char str_1[10] = "Tutorials";
   char str_2[10] = "Point";
   puts("string str_1 before using memcpy ");
   puts(str_1);
   memcpy (str_1, str_2, sizeof(str_2));
   puts("\nstring str_1 after using memcpy ");
   puts(str_1);
   return 0;
}

出力

string str_1 before using memcpy
Tutorials
string str_1 after using memcpy
Point

この例では、memcpy()の実行前はstr_1に「Tutorials」が格納されていますが、str_2の内容をコピーした後は「Point」に置き換わっていることが確認できます。

コピー元が変更されないことの確認

次の例では、コピー後のコピー元(str_2)の内容を表示しています。

#include <stdio.h>
#include <string.h>
int main (){
   char str_1[10] = "Tutorials";
   char str_2[10] = "Point";
   puts("string str_1 before using memcpy ");
   puts(str_1);
   memcpy (str_1,str_2, sizeof(str_2));
   puts("\nstring str_2 after using memcpy ");
   puts(str_2);
   return 0;
}

出力

string str_1 before using memcpy
Tutorials
string str_2 after using memcpy
Point

この結果から、memcpy()はコピー元のデータを変更せず、そのままコピー先へ転送していることがわかります。

注意点

memcpy()を使用する際は、以下の点に注意してください。

  • メモリ領域の重複 − コピー元とコピー先のメモリ領域が重なる場合、memcpy()の動作は未定義です。重複が起こりうる場合は、代わりにmemmove()関数を使用してください。
  • バッファオーバーフロー − コピー先のバッファサイズがnumバイト以上であることを必ず確認してください。そうしないと、バッファオーバーフローが発生する恐れがあります。
  • NULL終端の保証なし − 文字列を扱う場合、memcpy()は自動的にNULL文字を追加しません。必要に応じて明示的に終端文字を設定してください。

まとめ

memcpy()は、C/C++においてメモリブロックを高速にコピーするための基本的かつ重要な関数です。構文はシンプルで、コピー先・コピー元・バイト数の3つの引数を取ります。ただし、メモリ領域の重複チェックやNULL終端処理は行われないため、使用時には十分な注意が必要です。

  1. C/C++のputwchar()関数とは?使い方と実行例をわかりやすく解説

    この記事では、C++ STLにおけるputwchar()関数の動作、構文、および具体的な使用例について詳しく解説します。 putwchar()とは? putwchar()関数は、C++ STLに組み込まれている関数の一つで、<cwchar>ヘッダーファイル内で定義されています。この関数は、ワイド文字(wide character)を標準出力デバイスに書き込むために使用されます。引数として渡されたワイド文字を受け取り、システムの標準出力(stdout)に出力します。 なお、putwchar()は<cstdio>ヘッダーで定義されているputchar()関数のワイド文字版

  2. C/C++で学ぶAA木(AA Tree)とは?基本概念と平衡化操作を徹底解説

    AA木(AA Tree)とはコンピュータサイエンスにおいて、AA木(AA Tree)とは、順序付きデータを効率的に格納・検索するために実装された平衡木(バランスドツリー)の一種です。AA木は、赤黒木(Red-Black Tree)の変種として扱われます。赤黒木は二分探索木の一形態であり、要素の追加や削除を効率的にサポートします。赤黒木と大きく異なる点は、AA木では赤いノードを右の子としてのみ追加でき、左の子としては配置できないという制約があることです。この制約により、2-3-4木ではなく2-3木をシミュレートすることになり、その結果、木の保守操作が大幅に簡素化されます。赤黒木の平衡化アルゴリズ