前言
先说一下结论:
strcpy会复制’\0’,所以在使用该函数的时候要预留结束符的空间
在本文最后,有strcpy的替代方案
问题
今天发现了这样一个问题:
char *arr = new char[10];
strcpy(arr, "wangzhaaaa");
delete []arr;
执行这段代码将会报错,因为strcpy复制char*时会复制’\0’,所有在new 字符数组的时候应该预留’\0’的空间,否则在使用该字符串的时候可能会产生灾难性后果!代码应该改成这样
char *arr = new char[11];
strcpy(arr, "wangzhaaaa");
delete []arr;
这是个比较严重的问题!
解决方案
1、使用strcpy_s函数替代strcpy,这种情况下如果出现缓冲区溢出的问题,strcpy_s内部就会直接抛出异常,而不会像strcpy一样,产生一些隐晦的幽灵Bug。但strcpy_s仅仅只是会提前报错而已,个人感觉还是不好用。
在Windows下更佳的解决方案:
2、使用StringCchCopyA替代strcpy,即便源字符串的缓存区大于目标缓冲区,函数依然能正常工作,看以下代码即可:
#include <strsafe.h>
int main()
{
char *arr = new char[5];
StringCchCopyA(arr, 5, "abcdefgh");
printf("%s\n", arr);
delete[] arr;
system("pause");
}
‘">‘">
StringCchCopyA在复制时,如果超出了缓冲区,将会截断字符串,并在末尾添加结束符’\0’,这就比较完美了 ,需要注意的是该函数的第二个参数是字符长度而非字节数,在使用窄字节的时候无所谓,毕竟空间长度等于字节数,但在使用宽字节的时候要尤其注意,切记填空间长度而非字节数!
StringCchCopy第二个参数填目标字符串长度时需要算上结束符 ‘\0’所占用的1个字符长度
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/35357.html