首先
strcpy 是标准c函数数 任何 c/c++ 编译器都支持
strcpy_s 是微软定义的,其他编译器都不支持
strcpy定义:
char * strcpy ( char * destination, const char * source );
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
本文详细对比了C语言中的strcpy与strcpy_s函数,讲述了strcpy可能导致的缓冲区溢出问题,以及strcpy_s如何通过指定缓冲区大小来防止此类错误。特别指出,strcpy_s在源字符串长度超过目标缓冲区大小时会触发错误提示,而且即使源字符串长度小于缓冲区大小,它也会填充剩余部分以防止未初始化的数据暴露。
840

被折叠的 条评论
为什么被折叠?



