关于网友提出的“ 关于缓冲区溢出问题的例子,请分析结果”问题疑问,本网通过在网上对“ 关于缓冲区溢出问题的例子,请分析结果”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: 关于缓冲区溢出问题的例子,请分析结果
描述: #include
int main(){
char a[4];
do{
gets(a);
puts(a);
}
while (a!="#");
return 0 ;
}
当我输入的a超过3个字母时,输出的仍是我输入的.为什么不是截取 输出
解决方案1: strcat 也有同样的问题啊,所以小心使用:)
FW:
while (a!="#");
不可以这样写地~~
修改为:
while( strcmp(a,"#") )
解决方案2: 你把循环删掉看看,就知道是什麽问题了
解决方案3: C/C++不进行数组越界检查
从理论上说, 只要得到一个地址,你就可以通过这个地址进行加减运算访问到内存中的任何一个地方
至于改写那些地方会出什么后果,那是不可预测的
有些地址空间,操作系统做了保护,若要进行操作,则会被操作系统中止
有些地址空间,没有保护,进行操作也不会有什么提示,但若这些地址存放有其他重要数据,那么与这个数据相关的程序就可能崩溃~
解决方案4: 不过当输入超过一定的字符的时候程序退出了.(没有报错)
偶看了对应的汇编
4: char a[4];
5: do{
6: cin>>a;
00401028 lea eax,[ebp-4]
0040102B push eax
0040102C mov ecx,offset cin (0042aa60)
00401031 call istream::operator>> (004023e0)
7: cout<<>
00401036 lea ecx,[ebp-4]
00401039 push ecx
0040103A mov ecx,offset cout (0042aa20)
0040103F call ostream::operator<< (00401290)
8: }
看不出什么名堂.
不知谁能解释一下,偶也谢谢了:-)
解决方案5: gets不检查边界,是不进行截断的。想截断应该使用fgets(a, MAX, stdin);
以上介绍了“ 关于缓冲区溢出问题的例子,请分析结果”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/3156935.html