若有语句:char s1[ ]= 〞string 〞, s2[8],﹡s3,﹡s4= 〞string2 〞;则对库函数strcpy的错误调用是
C)strcpy(s3, 〞string1 〞); D)strcpy(s1, s2);
能不能解释详细一点,谢了 展开
若有语句:char s1[ ]= 〞string 〞, s2[8],﹡s3,﹡s4= 〞string2 〞;则对库函数strcpy的错误调用是strcpy(s3, 〞string1 〞);
strcpy不管是否会溢出,,保证不发生溢出是程序员做的,所以A正确。
s3未初始化,没有指向任何一片空间,C错误,B、D正常操作。
C 语言和 C++语言风格轻松、灵活,语法限制宽松,因而受到各类程序员的欢迎,是比较通用的编程语言,同时也是各大院校计算机专业的基本语言课程。
strcpy 函数由于不对数组边界进行检查,而非常容易造成各种缓冲区溢出的漏洞。这些漏洞很容易被利用,而造成严重的系统问题。在使用 strcpy 函数时,要小心谨慎。
扩展资料:
Strcpy函数的安全编码:
在编程时,加入错误检查,就可及时发现错误,并且对出现的异常进行处理。在编写 strcpy 函数时,首先尽量使目的缓冲区长度足够长,另外要检测目的缓冲区和源缓冲区。如果目的缓冲区或源缓冲区是空,就要在异常处理中结束程序。
如果,源字符串比目的缓冲区长度不长,也要在异常处理中结束程序,以防止出现溢出情况。任何程序都很难说是绝对安全,只能以尽可能安全的方式来处理 strcpy 函数。只要输入的字符串不以空字符结束,函数就会随时终止。这种检测容易实现。但是这样的检测也并不能确定函数一定安全。
另外,每添加一个错误检查,就会使程序更复杂,而且可能产生很多的 bug,增加很多的工作量。最重要的是,即使设计程序时非常仔细,也有可能会忽略一些细节问题,导致不可弥补的错误。
所以,在编写程序时,最安全的方法,就是尽可能不去使用 strcpy 函数。可以在程序的开头加上 #define strcpy Unsafe_strcpy。
这样,就会使 strcpy 函数在编译时产生错误,从而使我们在编程时可以完全摒弃strcpy 函数。在完全丢弃 strcpy 函数的同时,也就丢掉了众多依附于 strcpy 函数的 bug。
如果我的答案是正确的,是这么个原因:
数组也好,指针也好,从编译器角度看,就是一片空间外加一个地址。上面四个声明方式,只有第三个只给出了地址而没有给出任何空间声明,换句话说,第三个只是一个指针,而不是实际存在的东西。
strcpy是把一串内容拷贝到另一串地址上,如果目标处没有空间,那自然不能通过……
2019-12-10