中易网

明明数组只有一个字符,为什么输入多个字符,它照样会显示呢

答案:3  悬赏:80  
解决时间 2021-03-12 21:49
#include

void main()
{
char t[1];
scanf("%s",t);
printf("%s",t);
}
最佳答案
你好。。
char t[1]这一句,在内存中开辟了一块长度为1字节的内存块,并返回头指针到t,这个字节无法预料,而你的输入语句的作用是从头指针t开始向后赋值你输入的内容,如果长度大于一的话就会继续向后把第二个字节覆盖变成非0字符,知道容纳下你的输入为止。而printf这个t字符串,系统会从t指针指向的内存开始向后执行输出操作,直至遇到“\0”为止。而此时你之前声明的“\0”已经被你的输入字符串的第二个字母盖掉了,所以在此处不会终止,而是继续向后输出。如果你分到的这一块内存属于“0区”(自开机到现在从未用过),那么你的字符串结束的地方正好就是个0,输出也就成功完成了。

打个比方:
内存原来是 00 00 00 00 00 00
你的第一句话把内存变成了 00 00 00 00 00 00(不变)
然后如果你输入一个字符,a,内存变为 61 00 00 00 00 00
输出,会输出a。
如果你输入三个字符,abc,内存变为 61 62 63 00 00 00
输出,到0为止就是abc。

如果你是char[2]就比较明显了。
如果你的内存原来是 69 6a 6b 6c 6d 6e
你的第一句话把内存变为 69 6a 6b 6c 6d 6e(不变)
如果你输入一个字符a: 61 00 6b 6c 6d 6e(第二个是系统自动加的\0)
输出到0为止,a,正常。
如果你输入2个字符,ab: 61 62 6b 6c 6d 6e
输出到0为止 abklmn...(后面会输出什么是无法预料的= =,因为不知道什么时候会遇到0)

也就是说这个程序可以运行,但是不稳定,有时候是对的,有时候又会得到令人莫名其妙的结果。C语言就是怕越界,编译器也不报错,排错特别难。。

打字打得好累= =希望对你有帮助。。
望采纳,不懂追问= =
全部回答
这个是个很简单的问题,你看看你的输入是什么吧,一个字符串也会被当成一个字符的,如果用空格隔开就不会了
这是可以的, 因为在这个例子中,它原本申请的只有两个字符的大小长度(末尾是结束符),但是目前后面的空间也是可用的(如果你后面还有程序,那么可能就会把后面的内存分配出去,也就是说可能会报错,可能会只有一个字符,也可能还能输出现在的字符串,这是编译器的不同决定的)。因为毕竟现在只有你这样一个程序
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
大润发超市里的课级主管和课长是一个职位吗?
每个月发两次工资,每次不到所得税起征点。两
涨乐财富通买基金不能成交却不退钱
乡下菜馆重庆火锅城地址有知道的么?有点事想
三生石上一滴泪望海高歌歌词大意
虹口龙之梦2楼日系品牌
兰州大学国防生录取分数线
请问怎样才能查到某个街道或某个社区的常住人
抽沼气池粪水的时候 里面冒空气是什么原因
无锡分众传媒的评价
韩国绿康丽蜗牛霜使用方法
青岛奥林匹克帆船中心金湾路门地址在哪,我要
杭州师范大学有多少学生
我喜欢上了一个混混他不学习抽烟打架胳膊上还
博美怀孕初期都有些什么症状啊,各位大神求
推荐资讯
显像管灯丝供电电阻的问题
火线精英5星级宝箱能开出逆麟永久吗?
那一月我摇动所有的经筒/不为超度/只为,这句
怎样解决新手在SQL2008安装过程中遇到的问题
福银住宿地址在什么地方,想过去办事
本溪都有什么宽带
电脑开不了机,显示wondows未能启动。原因可
旺棠工业区9栋地址在什么地方,想过去办事
直线AB被直线EF所截,如果∠1=∠2,则∠AEF+∠C
吐热汗诊所在哪里啊,我有事要去这个地方
我的店面坐南朝北嘴里含钱金蟾怎么摆放
株洲市内哪里可以代写表白情书?
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?