ホームC言語Tips集配列・メモリ領域 ≫ 配列やメモリ領域の内容をコピーする

C言語Tips集 - 配列やメモリ領域の内容をコピーする

C言語で配列やメモリ領域の内容をコピーするには string.hmemcpy 関数か memmove 関数を使用します.

#include <string.h>
memcpy
void *memcpy(void * restrict s1,
    const void * restrict s2, size_t n);
memmove
void *memmove(void *s1, const void *s2, size_t n);

memcpy 関数は s2 が指すオブジェクトから,s1 が指すオブジェクトに n 文字コピーする関数です.なお,領域の重なり合うオブジェクト間でコピーが行われるときの動作は未定義です.

memmove 関数は memcpy 関数とほとんど同じですが,領域の重なり合うオブジェクト間でコピーが行われるときでも正しく動作します.

C言語サンプルプログラム

以下に memcpy 関数を使って int 型の配列をコピーするサンプルプログラムを示します.

/* header files */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* macros */
#define N 8

/* main */
int main(void) {
    int x1[] = {1, 2, 3, 4, 5, 6, 7, 8};
    int x2[N];
    int i;

    /* メモリ領域内の内容をコピー */
    memcpy(x2, x1, sizeof(int) * N);

    /* x1 と x2 の各要素を表示 */
    for ( i = 0; i < N; i++ ) {
        printf("x1[%d]: %d,   x2[%d]: %d\n",
                i, x1[i], i, x2[i]);
    }

    return EXIT_SUCCESS;
}

実行例

サンプルプログラムの実行結果は以下のようになります.

x1[0]: 1,   x2[0]: 1
x1[1]: 2,   x2[1]: 2
x1[2]: 3,   x2[2]: 3
x1[3]: 4,   x2[3]: 4
x1[4]: 5,   x2[4]: 5
x1[5]: 6,   x2[5]: 6
x1[6]: 7,   x2[6]: 7
x1[7]: 8,   x2[7]: 8

Cプログラマの必読書

たくさんあるC言語関連の書籍の中でも特に役に立った本です.よかったら参考にしてみてください.

C実践プログラミング 第3版

C言語の実践的参考書.少々値段は張りますが初心者を脱しようとしている人は絶対に読むべきです.
文法だけでなく,コーディングスタイルやデバッグなど文字通り「実践的」なことが書かれているので非常にためになります. オライリーの本は,読みにくい本が多いのですが本書はとても読みやすくオススメです.


C言語ポインタ完全制覇 (標準プログラマーズライブラリ)

ポインタの解説書としては最高の書籍です.
この1冊でポインタを完全に理解することができます.全くの初学者が読むには敷居が高いですが,入門書を読み終えた後に読むと非常に有益です.

配列の操作