strcpy 能增容吗?
请问,为什么第一段代码能执行通过,而没有出现第二段代码产生的编译错误:"array bounds overflow"。
(以下均在VC6,Win98下编译)
//////////代码1//////////
#include <iostream.h>
#include <string.h>
void main()
{
char name[1];
strcpy(name,"abcd");
cout << name <<"\n";
}
//////////代码2//////////
#include <iostream.h>
#include <string.h>
void main()
{
char name[1]="abcd";
cout << name <<"\n";
}
问题点数:50、回复次数:8Top
1 楼AdvRom(蓝色森林)回复于 2002-05-30 10:28:49 得分 20
C/C++里面指针是自由的,第一段代码执行期会出问题,编译器不可能太聪明,它检查不出来你在运行期可能产生的错误。
第二段就非常显然了,第一行代码编译器就能够判定出错另外。Top
2 楼kof99th(小虫)回复于 2002-05-30 10:31:34 得分 10
strcpy不检查数组越界问题,你可以在 vc的光盘上\vc98\crt\src\下找到strcpy.c文件,看一下原码就明白了。Top
3 楼96091103(室长)回复于 2002-05-30 10:33:29 得分 0
To 楼上的兄弟
第一段代码能够执行,没出现任何问题。Top
4 楼AdvRom(蓝色森林)回复于 2002-05-30 10:37:11 得分 0
什么叫没有出现任何问题?是指这个程序没有被操作系统强行关闭吗?
内存泄露、资源不释放、缓冲区越界等都是不会立刻出错的问题Top
5 楼96091103(室长)回复于 2002-05-30 10:43:53 得分 0
为什么strcpy(name,"abcde");会立刻出现强行关闭。
而strcpy(name,"abcd");不会。
Top
6 楼HostOOP(碧云黄花)回复于 2002-05-30 10:45:03 得分 10
strcpy确实不会检查内存越界的问题,但我们不提倡这种用法。运行时候不出问题纯属侥幸。Top
7 楼liushmh(想开书店:) )回复于 2002-05-30 10:45:24 得分 10
编译器肯定要检查语法,语义,规则等, 第二段代码的数组越界,自然要报错,二第一段代码,调用了库函数,编译器可能只发现了类型匹配,而不会具体检查
毕竟strcpy的参数原型是两个字符串指针。Top
8 楼96091103(室长)回复于 2002-05-30 10:51:12 得分 0
OKOKTop




