strcpy_s与 strcpy的 区别和 遇到的坑

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值