第131章 memcpy関数の新バージョン


memcpy関数は、バッファ間で指定のバイト数だけコピーを行いますが、VS2005では セキュリティ強化バージョンのmemcpy_s関数を利用します。

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

errno_t memcpy_s(
   void *dest,
   size_t sizeInBytes,
   const void *src,
   size_t count 
);
destは、コピー先のバッファ、srcはコピー元バッファ、countはコピーするバイト数です。sizeInButesは、コピー先バッファのサイズです。

では、簡単なサンプルを見てみましょう。

/* memcpy01.c */

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

int main()
{
	int array1[10], array2[10], i;
	struct _tagx {
		int a;
		char name[9];
	} x, y;

	for (i = 0; i < 10; i++)
		array1[i] = i;

	memcpy(array2, array1, sizeof(int) * 10);
	
	for (i = 0; i < 10; i++) {
		printf("array1[%d] = %d, array2[%d] = %d\n", i, array1[i], i, array2[i]);
	}

	printf("\n");
	memcpy_s(array2, sizeof(int) * 10, array1, sizeof(int) * 10);
	for (i = 0; i < 10; i++) {
		printf("array1[%d] = %d, array2[%d] = %d\n", i, array1[i], i, array2[i]);
	}

	printf("\n");

	x.a = 100;
	strcpy_s(x.name, (rsize_t)sizeof(int) * 9, "abc" );

	memcpy(&y, &x, sizeof(x));
	printf("y.a = %d, y.name = %s\n", y.a, y.name);

	memcpy_s(&y, sizeof(y), &x, sizeof(x));
	printf("y.a = %d, y.name = %s\n", y.a, y.name);
}
このプログラムでは、memcpyとmemcpy_sの両方の関数を使って結果が同じであることを確かめています。

最初に、array1配列に0から9までの整数値を代入して、memcpy関数でarray2にコピーしています。

次に、同じことをmemcpy_s関数を使って行っています。

また、xという構造体を用意してx.aに100を、x.nameに"abc"を格納しています。 これをmemcpyとmemcpy_s関数を利用してyにコピーしています。

実行結果は次のようになります。

当たり前ですが、どちらの関数を使っても結果は同じです。




[Index][総合Index] [Previous Chapter] [Next Chapter]

Update Sep/02/2007 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。