关于缓冲区溢出问题的例子,请分析结果

oliveadmire 2005-09-26 12:21:15
#include <stdio.h>

int main(){
char a[4];
do{
gets(a);
puts(a);
}
while (a!="#");
return 0 ;
}

当我输入的a超过3个字母时,输出的仍是我输入的.为什么不是截取 输出
...全文
340 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
kenosis 2005-09-27
  • 打赏
  • 举报
回复
还以为是利用缓冲区溢出在进行攻击呢
Zsen_J 2005-09-27
  • 打赏
  • 举报
回复
你把循環刪掉看看,就知道是什麽問題了
xiaocai0001 2005-09-27
  • 打赏
  • 举报
回复
C/C++不进行数组越界检查

从理论上说, 只要得到一个地址,你就可以通过这个地址进行加减运算访问到内存中的任何一个地方

至于改写那些地方会出什么后果,那是不可预测的

有些地址空间,操作系统做了保护,若要进行操作,则会被操作系统中止
有些地址空间,没有保护,进行操作也不会有什么提示,但若这些地址存放有其他重要数据,那么与这个数据相关的程序就可能崩溃~
ttlyfast 2005-09-27
  • 打赏
  • 举报
回复
现在的服务 越来越安全了!!

大力支持信息安全
jsjjms 2005-09-27
  • 打赏
  • 举报
回复
不过当输入超过一定的字符的时候程序退出了.(没有报错)
偶看了对应的汇编
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<<a;
00401036 lea ecx,[ebp-4]
00401039 push ecx
0040103A mov ecx,offset cout (0042aa20)
0040103F call ostream::operator<< (00401290)
8: }

看不出什么名堂.
不知谁能解释一下,偶也谢谢了:-)
jsjjms 2005-09-27
  • 打赏
  • 举报
回复
#include <stdio.h>

int main(){
char a[4];
do{
gets(a);
puts(a);
}
while (a!="#");
return 0 ;
}

///////////////
我在c++中也遇到过,感觉就是定义的数组没有对边界进行限制.
NetsEagle 2005-09-27
  • 打赏
  • 举报
回复
strcat 也有同样的问题啊,所以小心使用:)

FW:
while (a!="#");
不可以这样写地~~
修改为:
while( strcmp(a,"#") )
NetsEagle 2005-09-27
  • 打赏
  • 举报
回复
??
while (a!="#");

啥意思?
wxc_512 2005-09-27
  • 打赏
  • 举报
回复
哈哈, 楼上说的真简单(明了).
PaladinXu 2005-09-26
  • 打赏
  • 举报
回复
因为你还没写到导致程序崩溃或者出错的地方,多写点试试看!
megaboy 2005-09-26
  • 打赏
  • 举报
回复
gets不检查边界,是不进行截断的。想截断应该使用fgets(a, MAX, stdin);
antijpn 2005-09-26
  • 打赏
  • 举报
回复
还以为是利用缓冲区溢出在进行攻击呢……略过……

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧