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終端処理は行われないため、使用時には十分な注意が必要です。
-
C/C++のputwchar()関数とは?使い方と実行例をわかりやすく解説
この記事では、C++ STLにおけるputwchar()関数の動作、構文、および具体的な使用例について詳しく解説します。 putwchar()とは? putwchar()関数は、C++ STLに組み込まれている関数の一つで、<cwchar>ヘッダーファイル内で定義されています。この関数は、ワイド文字(wide character)を標準出力デバイスに書き込むために使用されます。引数として渡されたワイド文字を受け取り、システムの標準出力(stdout)に出力します。 なお、putwchar()は<cstdio>ヘッダーで定義されているputchar()関数のワイド文字版
-
C/C++で学ぶAA木(AA Tree)とは?基本概念と平衡化操作を徹底解説
AA木(AA Tree)とはコンピュータサイエンスにおいて、AA木(AA Tree)とは、順序付きデータを効率的に格納・検索するために実装された平衡木(バランスドツリー)の一種です。AA木は、赤黒木(Red-Black Tree)の変種として扱われます。赤黒木は二分探索木の一形態であり、要素の追加や削除を効率的にサポートします。赤黒木と大きく異なる点は、AA木では赤いノードを右の子としてのみ追加でき、左の子としては配置できないという制約があることです。この制約により、2-3-4木ではなく2-3木をシミュレートすることになり、その結果、木の保守操作が大幅に簡素化されます。赤黒木の平衡化アルゴリズ