首先
strcpy 是标準c函數數 任何 c/c++ 編譯器都支援
strcpy_s 是微軟定義的,其他編譯器都不支援
strcpy定義:
strcpy_s定義:
errno_t __cdecl strcpy_s(
char* _Destination,
size_t _SizeInBytes,
char const* _Source
);
strcpy 隻有兩個參數,當source 的字元串長度大于destination 的空間大小時,就會發生緩沖區溢出。
strcpy_s 的第二個參數代表緩沖區的大小,意在避免copy字元串時發生緩沖區溢出,當_Source字元串長度大于緩沖區大小時,會觸發ASSERT, 提示緩沖區太小。
注意:
當_Source字元串長度小于緩沖區大小時,strcpy_s 函數複制完字元串和末尾的 '\0’并不會停止,而是用0xfe填充後面的緩沖區,直到_SizeInBytes個。
例如:
const char* p1 = "123";
char buffer[8] = { 0 };
strcpy_s(buffer,8,p1);
此時 buffer 的資料
不是
31 32 33 00 00 00 00 00
而是
31 32 33 00 fe fe fe fe