なんだかGoodVibes

日々の勉強メモです。

【C】memcpyとmemmoveを使ったメモリブロックのコピー

こんにちは。
本日はC言語メモです。

概要

メモリブロックのコピーと言えばmemcpy()をよく使うかと思います。
他にもmemmove()というものもあるということを知ったので
それぞれの使い方について調べてみました。
どちらもstring.hに含まれています。


memcpyを使ったメモリブロックのコピー

memcpyのフォーマットは以下です。

void *memcpy(void *dest, const void *src, size_t n);

第1引数にコピー先のメモリのポインタ、
第2引数にコピー元のメモリのポインタ、 第3引数にコピーするバイト数

を指定します。
戻り値は、第1引数に指定した値になります。

memcpy()を使用する際に注意することは
コピー元とコピー先のメモリブロックが重ならないようにすることです。
メモリブロックの重なりを想定していないため
重なっていた場合は想定がの動作となる可能性があります。

#include <stdio.h>
#include <string.h>

int main() {
    char src[7] = "abcdef";
    char dest[7];

    memcpy(dest, src, 7);
    printf("dest => %s\n", dest);
}

実行結果は以下です。

dest => abcdef


memmoveを使ったメモリブロックのコピー

引数、戻り値についてはmemcpy()と同様です。

memmove()memcpy()と異なり、
メモリブロックの重なりを許容します。
そのため、memcpy()よりも安全にメモリブロックのコピーが可能です。

#include <stdio.h>
#include <string.h>

int main() {
    char data[7] = "ABcdEF";

    memmove(data + 2, data + 4, 2);
    printf("data => %s\n", data);
}

実行結果は以下です。

data => ABEFEF



以上です。