先頭へ戻る

memcpy | Programming Place Plus C言語編 標準ライブラリのリファレンス

Programming Place Plus トップページ -- C言語編 -- 標準ライブラリのリファレンス(名前順)

Programming Place Plus トップページ -- C言語編 -- 標準ライブラリのリファレンス(ヘッダ別)

先頭へ戻る

memcpy関数

概要

あるメモリアドレスを起点に、一定の文字数を別のメモリアドレスへコピーする。

ヘッダ

string.h

形式

void* memcpy(void* s1, const void* s2, size_t size);

引数

s1

コピー先の先頭のメモリアドレス。

s2

コピー元の先頭のメモリアドレス。

size

コピーする文字数。

戻り値

s1 が返される。

詳細

基本的な意味は strcpy関数と変わらないが、ヌル文字によって打ち切られることがない。

注意

コピー先の範囲と、コピー元の範囲が重なり合っている場合の結果は未定義である。重なり合う場合には、memmove関数を使えば良い。
この要件の違いは、C99以降では、memcpy関数の仮引数が restrict であるのに対し、memmove関数は restrict でないことで明確になっている。

使用例

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

int main(void)
{
    char s1[] = "abcdefg";
    char s2[] = "xyz";

    printf( "%s\n", memcpy( s1, s2, sizeof(s2)-1 ) );

    return 0;
}

実行結果:

xyzdefg

関連

コピー先範囲とコピー元範囲が重なり合う場合は、memmove関数を使う。文字列のコピーならば、strcpy関数strncpy関数が使える。
文字をワイド文字とみなして同様の処理を行う wmemcpy関数がある。

解説章


参考リンク


------------------------------------------------------------------------

更新履歴

'2018/4/22 解説中で C95 を(C89 に対して)特別扱いしないように修正。そもそもC言語編は C95ベースなので、余計な説明は省く。

'2018/4/11 全体的に文章を見直し修正。C99 の restrict について追記。

'2018/2/22 「サイズ」という表記について表現を統一。 型のサイズ(バイト数)を表しているところは「大きさ」、要素数を表しているところは「要素数」。

'2018/1/22 新規作成。


------------------------------------------------------------------------

標準ライブラリのリファレンス(名前順)のトップページへ

標準ライブラリのリファレンス(ヘッダ別)のトップページへ

C言語編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
Twitter でツイート Twitter をフォロー LINE で送る
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー