【C言語】memcpyの使い方|配列・構造体のコピーとサイズ指定の注意点

広告この記事には広告・アフィリエイトリンクが含まれる場合があります。
目次
memcpyは、配列や構造体、受信バッファなどのメモリ領域を別の場所へコピーするための標準関数です。
コピーしたいデータを簡単にコピーできる一方で、コピーサイズやコピー先の容量を間違えると不具合につながります。
この記事では、memcpyの基本的な使い方、strcpyとの違い、構造体や配列での使用例、使うときの注意点を順番に解説します。
目的 | 講座名 | 到達点 | レベル/前提 | 想定時間 | こんな人に | 評価 |
|---|---|---|---|---|---|---|
まずはC/C++を一気に俯瞰 | C/C++の基礎を通しで学び、ゲーム/組み込み/OS基礎にも触れる | 初心者〜初級 | 13時間 | C/C++をまとめて体験したい/ポインタでつまずいた経験がある | | |
図解で“ゼロから”C言語 | 図解中心で基礎→配列/構造体/ポインタまで。終盤はネットワーク等の応用も | 超初心者〜初級 | 7時間 | 活字が苦手/イメージで理解したい/まずはCだけに集中したい | | |
図解+演習で基礎を速習 | “動きの理解”重視でゼロ→ポインタまで。演習問題で定着 | 超初心者〜初級 | 16時間 | 図解多め+演習で短期に基礎固めしたい | |
memcpy 関数とは
memcpy 関数は、指定のサイズ分メモリをコピーする関数です。
memcpy 関数の形式
memcpy 関数の形式は、以下のようになっています。
#include <string.h>
void *memcpy(void *buf1, const void *buf2, size_t n);"string.h"をインクルードして使用します。
また、引数は以下の値を設定します。
第一引数 | コピー先のポインタ |
第二引数 | コピー元のポインタ |
第三引数 | コピーするメモリサイズ |
memcpy 関数でなにができるの?
それでは実際にmemcpy 関数の使い方をみていきましょう。
memcpy関数を使って文字列をコピー

文字列をコピーするときにも、memcpy 関数を使用します。
実際にmemcpy 関数を使用したコードです。
#include<stdio.h>
#include<string.h>
int main(void){
char moji_1[] = "abcdefg";
char moji_2[] = "ABCDEFG";
printf("文字列 moji_2: %s\n", moji_2);
memcpy(moji_2, moji_1, 7);
printf("文字列 moji_2: %s\n", moji_2);
return 0;
}実行結果
文字列 moji_2: ABCDEFG
文字列 moji_2: abcdefg文字列 moji_2 に文字列 moji_1 の "abcdefg"がコピーされています。
memcpy 関数を使って配列データをコピー

配列をコピーするときにもmemcpy 関数を使用します。
以下、memcpy 関数を使用し、配列データをコピーするコードです。
#include<stdio.h>
#include<string.h>
int main(void){
int ary_1[5] = {0, 1, 2, 3, 4};
int ary_2[5] = {5, 6, 7, 8, 9};
int i;
// 配列 ary_2 の出力
printf("配列 ary_2:");
for(i = 0; i < 5; i++){
printf("%d", ary_2[i]);
}
printf("\n");
// 配列 ary_1のデータを配列ary_2に配列 ary_1のサイズ分コピー
memcpy(ary_2, ary_1, sizeof(ary_1));
// 再び配列 ary_2 の出力
printf("配列 ary_2:");
for(i = 0; i < 5; i++){
printf("%d", ary_2[i]);
}
printf("\n");
return 0;
}実行結果
配列 ary_2:56789
配列 ary_2:01234配列 ary_1 のデータが配列 ary_2にコピーされました。
コピーするサイズについて今回は、sizeof 演算子を使用しています。
sizeof 演算子を使用することで、配列データをまるごとコピーできます。
sizeof 演算子について、詳しく知りたい方は、こちらをみてください。
まとめ
memcpy 関数を使って、メモリを操作できるようになると、
プログラムの幅が大きく広がります。
ぜひC言語特有のメモリ操作を身につけていってください。




コメント
コメントはまだありません