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関数を使うことで簡単に配列をコピーすることができました。