C语言中关于数组的问题。

voidmain(){charc[4];scanf("%s",c);printf("%s\n",c);}我输入china,为什么程序仍能正常运行,输出china呢,我定义... void main()
{ char c[4];
scanf("%s",c);
printf("%s\n",c);
}
我输入china,为什么程序仍能正常运行,输出china呢,我定义的数组长度只有4啊。
展开
 我来答
恩爱又坚定的小329
2006-05-29 · TA获得超过292个赞
知道答主
回答量:245
采纳率:0%
帮助的人: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.
百度网友f97e85c
2006-05-29 · TA获得超过358个赞
知道小有建树答主
回答量:271
采纳率:0%
帮助的人:0
展开全部
如上所说。。这确实是编译器问题。它不报错。
如要使编辑器显示的结果加以字符个数限制。我们可以在这行语句中加以限制说明:scanf("%4s",c);里面的4就是限制的个数。这样输入的字符只把4个字符存入数组中。所以只显示出4个字符。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友32cdd9945
2006-05-28 · TA获得超过1374个赞
知道大有可为答主
回答量:2429
采纳率:100%
帮助的人:1907万
展开全部
这就是为什么现在很多软件存在 缓冲区溢出漏洞的 原因了。
scanf(\"%s\",c); 会覆盖c数组后面的内存,而printf(\"%s\\n\",c);
又是非遇到\'\\0\' 才停止打印
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wangtk1982
2006-05-29 · TA获得超过3742个赞
知道大有可为答主
回答量:3206
采纳率:100%
帮助的人:1412万
展开全部
windows下tc等编译器确实如此, 就是widebright 同志解释.
vc等在默认设置下会报运行错!在输出之后,

标准C下其他平台与编译器也有关系,如scounix7在运行会前报错.......
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
涛_jing1986
2006-05-28
知道答主
回答量:93
采纳率:0%
帮助的人:0
展开全部
我也出现过这种问题,很正常,这是软件的问题,一般你再重装一个就行
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(5)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式