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_s
memcpy
メモリオーバーフローの効果的な検出(コピーされるバイト数がターゲットアドレスが保持できる数、つまりサイズを超える)と比較すると、戻り値で確認できます。。ただし、memcpyは保証しません。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()
。オーバーフローのリスクを回避するためにバッファー長を指定することで==。