Categories: C言語

【C言語】配列を複製(コピー)する方法を解説

この記事では、C言語で配列を複製(コピー)する方法を解説します。

配列をコピーするには、for文で要素を 1つずつ代入するか、memcpy関数を使うことで簡単に実装することができます。

それでは、サンプルを交えながら配列をコピーする方法を見ていきましょう!

for文で配列をコピーする

コピーしたい配列の要素をコピー先の配列に 1つずつ代入することで同等の配列を生成することができます。

#include <stdio.h>

// 配列の長さ
#define LENGTH 3

int main(void) {

    // 配列の宣言・初期化
    int nums[LENGTH] = {1, 2, 3};
    int copy_nums[LENGTH];

    // 要素を1つずつ代入
    for(int i = 0; i < LENGTH; i++){
        copy_nums[i] = nums[i];
    }

    // 出力
    for(int i = 0; i < LENGTH; i++){
        printf("%d\n", copy_nums[i]);
    }
}

実行結果

1
2
3

全ての要素を二倍した配列を生成したいと思ったときも同様の方法で可能です。

#include <stdio.h>

// 配列の長さ
#define LENGTH 3

int main(void) {

    // 配列の宣言・初期化
    int nums[LENGTH] = {1, 2, 3};
    int copy_nums[LENGTH];

    // 要素を1つずつ代入
    for(int i = 0; i < LENGTH; i++){
        // 二倍した要素を代入
        copy_nums[i] = nums[i] * 2;
    }

    // 出力
    for(int i = 0; i < LENGTH; i++){
        printf("%d\n", copy_nums[i]);
    }
}

実行結果

2
4
6

memcpy関数で配列をコピーする

memcpy関数を使うことで配列をコピーできます。

#include <string.h>
void *memcpy(void *buf1, const void *buf2, size_t n);

memcpy関数は、buf1引数に指定したメモリブロックに buf2引数に指定したメモリブロックを n引数のバイト数分だけコピーします。

#include <stdio.h>
#include <string.h>  // インクルード

// 配列のサイズ
#define LENGTH 3

int main(void) {
    
    // 配列の宣言・初期化
    int nums[LENGTH] = {1, 2, 3};
    int copy_nums[LENGTH];

    // コピー
    memcpy(copy_nums, nums, sizeof(nums));
    
    // 出力
    for(int i = 0; i < LENGTH; i++){
        printf("%d\n", copy_nums[i]);
    }
}

実行結果

1
2
3

特定の要素のみコピーしたい場合は、n引数に sizeof(要素の型) * コピーしたい要素数を指定するか、

#include <stdio.h>
#include <string.h>  // インクルード

// 配列のサイズ
#define LENGTH 3
// コピー先の配列のサイズ
#define COPY_LENGTH 2

int main(void) {

    // 配列の宣言・初期化
    int nums[LENGTH] = {1, 2, 3};
    int copy_nums[COPY_LENGTH];

    // コピー
    memcpy(copy_nums, nums, sizeof(int) * 2);
    
    // 出力
    for(int i = 0; i < COPY_LENGTH; i++){
        printf("%d\n", copy_nums[i]);
    }
}

実行結果

1
2

buf2引数にコピー元の配列を指定する際、コピーを開始したい要素のポインタを渡すことで実装することができます。

#include <stdio.h>
#include <string.h>  // インクルード

// 配列のサイズ
#define LENGTH (3)
// コピー先の配列のサイズ
#define COPY_LENGTH 2

int main(void) {

    // 配列の宣言・初期化
    int nums[LENGTH] = {1, 2, 3};
    int copy_nums[COPY_LENGTH];

    // コピー
    memcpy(copy_nums, &nums[1], sizeof(int) * 2);
    
    // 出力
    for(int i = 0; i < COPY_LENGTH; i++){
        printf("%d\n", copy_nums[i]);
    }
}

実行結果

2
3

このように、memcpy関数を使うことで簡単に配列をコピーすることができました。

ゆうまる

独学でプログラミングを勉強しているおじさん。いろんな言語を勉強したが浅く広くなためあまり仕事につながらない。また忘れっぽいため自分のブログを備忘録としても使っている。産まれてこのかたずっとネコを飼ってる生粋のネコ派。最近お腹が出てきて筋トレに奮闘中!

Recent Posts

【Dart】コンストラクタのデフォルト引数について

Dartのコンストラクタのデフォルト引数…

2週間 ago

【Unity】有料アセットを無料で手に入れる方法

この記事では、Unityの有料アセットを…

4か月 ago

【Python】任意の秒数だけ処理を一時停止する方法【sleep()関数】

この記事では、Pythonで任意の秒数だ…

1年 ago

【Python】Wordの文書の新規作成と読み書き

この記事では、Pythonを使ってWor…

1年 ago

【Python】メタクラスって結局なんなの?

この記事では、Pythonのメタクラスに…

1年 ago