こんにちは。
本日は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
以上です。