memcpy


目次に戻る


久しぶりの関数紹介です。今日紹介する関数 memcpy は指定したサイズ分だけメモリの 内容をコピーする関数です。
 
次の例を見てください
/* buff1の内容をbuff2にコピーする 単純編*/
int i;
char buff1[20]="abcdefghijk";
char buff2[20]="zzzzzzzzzzz";

printf("buff1 = %s, buff2 = %s\n",buff1,buff2);

for( i=0 ; i<sizeof(buff1)/sizeof(buff1[0]) ; i++ ){
    buff2[i] = buff1[i];
}

printf("buff1 = %s, buff2 = %s\n",buff1,buff2);

これをmemcpyを使うと次のようになります。
/* buff1の内容をbuff2にコピーする memcpy編 */
char buff1[20]="abcdefghijk";
char buff2[20]="zzzzzzzzzzz";

printf("buff1 = %s, buff2 = %s\n",buff1,buff2);

memcpy( buff2 , buff1 , sizeof(buff1)/sizeof(buff1[0]) );

printf("buff1 = %s, buff2 = %s\n",buff1,buff2);

3行のプログラムが1行になっただけですが、たったこれだけでもプログラムが見やすくな ります。memcpyの良いところはプログラムがすっきりするばかりでなく、処理が高速にな る場合があります。これは、ライブラリとして提供されているプログラムがアセンブラで書 かれている可能性があるからです。配列変数をコピーしたい場合はmemcpyと覚えておい てOKでしょう。
 
ただし、memcpyは良いことだけではありません。欠点があります。それは、同一配列 変数内で使用するとどのような結果になるかがわからないのです。
/* memcpyを使うと結果がわからなくなる例 */
char buff[30]="abcdefghijklmnopqrstuvwxyz";
char *p = &buff[1];

printf("buff = %s , p = %s\n",buff,p);

memcpy( p , buff , 15 );

printf("buff = %s , p = %s\n",buff,p);

こういう場合はどうするかは明日紹介します。


目次に戻る