strcpy_s与 strcpy的 区别和 遇到的坑

本文详细对比了C语言中的strcpy与strcpy_s函数,讲述了strcpy可能导致的缓冲区溢出问题,以及strcpy_s如何通过指定缓冲区大小来防止此类错误。特别指出,strcpy_s在源字符串长度超过目标缓冲区大小时会触发错误提示,而且即使源字符串长度小于缓冲区大小,它也会填充剩余部分以防止未初始化的数据暴露。

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值