memcpyとmemcpy_s、memmoveとmemmove_s、sprintfとsprintf_sの違い

1. memcpyおよびmemcpy_s:
2つの関数プロトタイプ:

void* memcpy(
	void *restrict s1, 
	const void *restrict s2, 
	size_t n);
	
errno_t memcpy_s(
	void *dest, // dest:目标的地址
	size_t numberOfElements, // numberOfElements:目标的size
	const void *src, // src:源地址
	size_t count); // count:要拷贝的字节数

memcpy_smemcpyメモリオーバーフローの効果的な検出(コピーされるバイト数がターゲットアドレスが保持できる数、つまりサイズを超える)と比較すると、戻り値で確認できます。ただし、me​​mcpyは保証しません。memmoveとmemmove_s、strcpyとstrcpy_sは似ています。

参考資料:memcpyおよびmemcpy_sの使用

2. memcpyおよびmemmoveおよびmemmove_s:
2つの関数プロトタイプ:

void *memcpy(void *restrict s1, const void *restrict s2, size_t n);
void *memmove(void *s1, const void *s2, size_t n);
errno_t memmove_s(void * dest,rsize_t destsz,const void * src,rsize_t count);

目的の二つの機能:s2場所を指さnにコピーされたバイトデータs1指さ場所。
2つの機能の違い:違いはキーワードの制限にあり、memcpyは2つのメモリ領域間にデータの重複がないと想定し、memmoveにはこの前提条件はありません。
memmove与対照的に、memcpyメモリ領域のオーバーラップの問題を効果的に検出できます。Memcpyは、メモリ領域のオーバーラップに関係なく、直接コピーします; memmoveは最初にオーバーラップを検出し、次にコピー開始位置を決定します。
コピーされた2つの領域がオーバーラップしているときにmemcpyを使用すると、結果は予測できません(成功または失敗する可能性があります)。

参照:memcpyとmemmove Tencent Cloud の違い
:memmove_sとmemmove

3. sprintfおよびsprintf_s:
含める必要があるヘッダーファイル:stdio.h
文字列フォーマット関数、プロトタイプ:

int sprintf_s(
	char *buffer, // char型指针,指向将要写入字符串的缓冲区。
	size_t sizeOfBuffer,
	const char *format, // format:格式化字符串
	[argument...] // va_list,变参列表(任意多个任何类型的数据)
);

char buffer[200]; // 需要预先分配缓冲区
sprintf_s( buffer, sizeof(buffer), "Output:%s character count = %d\n", var1, var2);
sprintf_s(buffer, sizeof(buffer), "%s %s %s %s",path1,filepath,path3,path4);

sprintf_sの機能は、データをフォーマットして文字列に出力することです。最後のパラメーターは、可変パラメーターリスト(任意のタイプの任意の数のデータ)です。sprintf_s()はいsprintf()、安全なバージョンです。バッファの長さを指定してsprintf()、オーバーフローのリスクを回避してください

参照:C ++ Baidu百科事典におけるsprintfとsprintf_sの違い
:sprintf_s

総括する:

1. memcpy–> memcpy_sはメモリオーバーフローの問題を考慮し、memcpy_s–> memmove_sはメモリ領域のオーバーラップの問題を考慮しているため、memmove_sを使用するのが最も安全ですが、memcpy_sに比べて、オーバーラップの有無を検出するオーバーヘッドが多くなります。
2.文字列フォーマット関数sprintf_sの最後のパラメーターは、可変パラメーターリスト(任意のタイプの任意の数のデータ)です。sprintf_s()はいsprintf()、セキュリティバージョンsprintf()。オーバーフローのリスクを回避するためにバッファー長を指定することで==。

おすすめ

転載: blog.csdn.net/qq_33726635/article/details/107453225