明明数组只有一个字符,为什么输入多个字符,它照样会显示呢
答案:3 悬赏:80
解决时间 2021-03-12 21:49
- 提问者网友:℡她的他i☆
- 2021-03-12 06:12
#include
void main()
{
char t[1];
scanf("%s",t);
printf("%s",t);
}
最佳答案
- 二级知识专家网友:你好陌生人
- 2021-03-12 07:15
你好。。
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语言就是怕越界,编译器也不报错,排错特别难。。
打字打得好累= =希望对你有帮助。。
望采纳,不懂追问= =
全部回答
- 1楼网友:哥在撩妹请勿打扰
- 2021-03-12 07:29
这个是个很简单的问题,你看看你的输入是什么吧,一个字符串也会被当成一个字符的,如果用空格隔开就不会了
- 2楼网友:虚伪的现实
- 2021-03-12 07:24
这是可以的,
因为在这个例子中,它原本申请的只有两个字符的大小长度(末尾是结束符),但是目前后面的空间也是可用的(如果你后面还有程序,那么可能就会把后面的内存分配出去,也就是说可能会报错,可能会只有一个字符,也可能还能输出现在的字符串,这是编译器的不同决定的)。因为毕竟现在只有你这样一个程序
我要举报
大家都在看
推荐资讯