运动神经元治好案例:C语言中关于数组的问题。

来源:百度文库 编辑:杭州交通信息网 时间:2024/04/28 14:50:41
void main()
{ char c[4];
scanf("%s",c);
printf("%s\n",c);
}
我输入china,为什么程序仍能正常运行,输出china呢,我定义的数组长度只有4啊。

这就是为什么现在很多软件存在 缓冲区溢出漏洞的 原因了。
scanf(\"%s\",c); 会覆盖c数组后面的内存,而printf(\"%s\\n\",c);
又是非遇到\'\\0\' 才停止打印

>>这就是为什么现在很多软件存在 缓冲区溢出漏洞的 原因了。
>>scanf(\"%s\",c); 会覆盖c数组后面的内存,而printf(\"%s\\n\",c);
>>又是非遇到\'\\0\' 才停止打印
scanf("%s",c);可以造成缓冲区漏洞,但是那和楼主的情况是不同的.楼主的程序覆盖的是变量存储空间的内
存.而不是缓冲区的内存,除非他覆盖的地址空间大得可怕,否则是不会覆盖到堆栈地址造成溢出的.
楼主的情况是一种非法操作.由于%s不检查数组是否越界,该程序在输入的时候,占用了紧邻char c[4]的内存.
另外,c语言并没有规定越界检查的位置,所以检查要靠自己.
应该花时间看一下c89/c90,c99

>>我也出现过这种问题,很正常,
正常的.

>>这是软件的问题,一般你再重装一个就行
不是软件问题.有可能编译器考虑到了这些问题(%s不检查数组越界),在编译的时候给出一定的提示.
但是程序中接受超过数组长度字符串的原因是 %s 不检查数组越界.

另外,我们写出来的程序应该是编译器无关的,不应该依靠编译器.
因为编译器并没有统一的标准.而只对c语言进行了一定的标准化.编译器都应该可以编译这些标准c.

如上所说。。这确实是编译器问题。它不报错。
如要使编辑器显示的结果加以字符个数限制。我们可以在这行语句中加以限制说明:scanf("%4s",c);里面的4就是限制的个数。这样输入的字符只把4个字符存入数组中。所以只显示出4个字符。

windows下tc等编译器确实如此, 就是widebright 同志解释.
vc等在默认设置下会报运行错!在输出之后,

标准C下其他平台与编译器也有关系,如scounix7在运行会前报错.......

不是软件的原因

widebright的答应比较好

char *c= new char[10];