#include<stdio.h>
int main(void)
{
char ch[5]={'\0'};
scanf("%s",ch);
puts(ch);
return 0;
}
c语言 定义一个含5个元素的字符型数组ch,再输入时敲了6个字符,打印ch时,为什么显示了6个字符?
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
3条回答 默认 最新
技术专家团-Plio大咸鱼 2021-09-14 13:55关注因为C语言是对程序员信任的
你新建char数组的时候,系统会分配一段空间给你,但是你是用访存操作的时候能访问到的并不局限这段分好的空间,你可以通过char数组的首地址访问这段内存周围的任意位置,这一般被称为"越界访问"
越界访问是一种未定义行为,但是C语言对此不会做过多限制
当你将长度为6的字符串scanf进去的时候,scanf会将这一组字符串贴在首地址为ch的内存内,这个粘贴的操作是不会收到ch长度限制的,所以实际上这里已经覆盖了未申请的内存
当输出的时候,对于字符串输出,系统也会从ch首地址开始对内存进行遍历,直到找到第一个'\0'(这标志着字符串的结束),并将这些结果全部打印出来,所以其实这中间形成了两次越界,但是程序从语义方面是可以成功执行的
当你创建多个局部变量的时候,越界访问可能会造成对一个变量的修改影响其他变量的内存空间,所以一般写代码的时候还是要避免这种越界.
有帮助望采纳解决 无用评论 打赏 举报