天天看点

strcpy_s与 strcpy的 区别和 遇到的坑

首先

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

继续阅读