strcpy_s与 strcpy的 区别和 遇到的坑

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值