首先
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