首页 > 试题广场 >

int func(){char b[2]={0};strcp

[单选题]
int func(){char b[2]={0};strcpy(b,"aaaa");} 以下说法哪个正确( )
  • Debug版崩溃,Release版正常
  • Debug版正常,Release版崩溃
  • Debug版崩溃,Release版崩溃
  • Debug版正常,Release版正常
A strcpy函数用于将一个字符串复制到另一个字符串,它有两个参数:源字符串和目标字符串,函数在结束时会返回一个到目标字符串的指针.发生错误时,函数会返回一个空指针.由于目标字符数组b存储空间小于源字符串"aaaa"空间,该函数使用将会发生错误.如果是调试版构建(Debug Build),它会显示一个Debug Assertion Failed的对话框,提示错误,然后终止应用程序运行;而如果是发行版构建(Release Build),应用程序将不会察觉到该错误,而是继续覆盖其内存后面的部分,导致内存中数据被破坏,可能会对程序造成意外的结果,因为应用程序未能察觉出错,所以不会崩溃,向用户报告错误. strcpy的问题在于没有指定缓冲区最大程度的参数,所以应用程序无法判定自己是否会破坏内存,由于这种函数经常被恶意滥用,所以编写程序的时候应当避免使用.较好的解决办法是使用指示长度的函数如strncpy来代替使用.
发表于 2015-10-09 19:21:31 回复(0)
实测:选 A 
(以下为摘录) 
Debug和Release版,调用不同的Runtime Library。 

调试版本的 Runtime Library 包含了调试信息,并采用了一些保护机制以帮助发现错误,因此性能不如发布版本。 
编译器提供的 Runtime Library 通常很稳定,不会造成 Release 版错误;倒是由于 Debug 的 Runtime Library 加强了对错误的检测,如堆内存分配,有时会出现 Debug 有错但 Release 正常的现象。

应当指出的是,如果 Debug 有错,即使 Release 正常,程序肯定是有 Bug 的,只不过可能是 Release 版的某次运行没有表现出来而已。 
编辑于 2015-10-09 16:00:22 回复(0)
A
【解析】
Debug中有assert宏,所以会崩溃;
Release不会崩溃。。但是结果是不确定的,因为覆盖了其他的内存。
发表于 2015-01-11 11:14:42 回复(0)
代码中存在数组越位。
在DEBUG 下 编译器不会为代码优化 所以会本快,
而RELEASE 下面 编译器会检测一些错误 比如内存越位 不会出现异常
所以   
 选 A
发表于 2014-12-29 15:54:35 回复(0)