vs2008中为啥使用strcpy不安全而用strcpy_s替换(尽量详细点)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vs2008中为啥使用strcpy不安全而用strcpy_s替换(尽量详细点)相关的知识,希望对你有一定的参考价值。
这是编译器的警告:
1>c:\users\lenovo\documents\visual studio 2008\projects\继承\继承\继承.cpp(22) : warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use
例如, 我们有个数组: unsigned char buf[2];
当我们使用strcpy(buf, "1234567")时, 以buf为起点的*(buf+3)也就是buf[3]被写入值, 但是, 此时也许这个buf+3这个位置被其它的程序或变量使用时, 则会改变其它变量的值.
而strcpy_s(buf,2,"1234567")则告诉程序它只有两个字节, 此时, 程序不会将数据写入到 buf+3的地址中, 所以它更安全. 参考技术A 原型声明:extern char *strcpy(char *dest,const char *src);
实际使用时,要求调用前预先申请dest指针的内存空间,但是可能此空间的长度小于src的长度。此函数在复制字符串时,将会从src开始,一直碰到NULL为止,这样在复制时就可能超出dest的范围,导致内存错误。
strcpy_s多了一个dest空间长度的参数,会控制复制字符串的过程,不会越界,因而这个函数是安全的。
strcpy函数在VS2015无法使用的问题
一:原因:一般认为是vs准备弃用strcpy的,安全性较低,所以微软提供了strcpy_s来代替
然而,strcpy_s并没有strcpy好用,我们要想继续在VS2015中使用strcpy该怎么办 呢?下面是几种解决方法
解决方法:
1.其实在下面的输出错误信息中有解决方法,“To disable deprecation , use _CRT_SECURE_NO_WARNINGS”,意思是我们可以不进行兼容性检查,我们可以在项目-属性-配置属性-c/c++-预处理器-预处理定义里边加上一句:_CRT_SECURE_NO_WARNINGS ,如下图所示
2.也是在下面的输出信息中,我们可以看到有一处错误代号“ error C4996:”,所以我们可以在程序开头加上一句“#pragma warning(disable:4996)”就行,意思是忽略这个错误,如下图
3.第三种方法是:我们可以在:项目-属性-配置属性-c/c++中的常规,里面有个SDL选项,关了。还有在代码生成中有个安全检查选项(/GS),关了。虽然这种方法也可以解决这个问题,但是我本人不太提倡这种解决办法,还是前两种解决方法比较好
以上是关于vs2008中为啥使用strcpy不安全而用strcpy_s替换(尽量详细点)的主要内容,如果未能解决你的问题,请参考以下文章
C语言 显示strcpy出错 求大神解释 编译器是vs2013
VS2008和VS2010 的语法高亮插件 WordLight