すべての記事

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

広告この記事には広告・アフィリエイトリンクが含まれる場合があります。

目次

memcpyは、配列や構造体、受信バッファなどのメモリ領域を別の場所へコピーするための標準関数です。

コピーしたいデータを簡単にコピーできる一方で、コピーサイズやコピー先の容量を間違えると不具合につながります。

この記事では、memcpyの基本的な使い方、strcpyとの違い、構造体や配列での使用例、使うときの注意点を順番に解説します。

目的

講座名

到達点

レベル/前提

想定時間

こんな人に

評価

まずはC/C++を一気に俯瞰

一週間で身につくC/C++言語

C/C++の基礎を通しで学び、ゲーム/組み込み/OS基礎にも触れる

初心者〜初級

13時間

C/C++をまとめて体験したい/ポインタでつまずいた経験がある

 
[review_stars 4.5/5]

図解で“ゼロから”C言語

イメージでわかる!基礎知識ゼロからのC言語。エンジニアが教えるC言語完全攻略コース。

図解中心で基礎→配列/構造体/ポインタまで。終盤はネットワーク等の応用も

超初心者〜初級

7時間

活字が苦手/イメージで理解したい/まずはCだけに集中したい

 
[review_stars 4/5]

図解+演習で基礎を速習

【C言語基礎マスター速習講座】知識ゼロからポインタまで完全習得!豊富な図解と演習問題で難しい概念も完全理解!

“動きの理解”重視でゼロ→ポインタまで。演習問題で定着

超初心者〜初級

16時間

図解多め+演習で短期に基礎固めしたい

 
[review_stars 3/5]

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言語特有のメモリ操作を身につけていってください。

参考(おすすめ教材)

コメント

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