c语言 定义一个含5个元素的字符型数组ch,再输入时敲了6个字符,打印ch时,为什么显示了6个字符?

#include<stdio.h>
int main(void)
{
    char ch[5]={'\0'};
    scanf("%s",ch);
    puts(ch);
    return 0;
}

img

因为C语言是对程序员信任的
你新建char数组的时候,系统会分配一段空间给你,但是你是用访存操作的时候能访问到的并不局限这段分好的空间,你可以通过char数组的首地址访问这段内存周围的任意位置,这一般被称为"越界访问"
越界访问是一种未定义行为,但是C语言对此不会做过多限制
当你将长度为6的字符串scanf进去的时候,scanf会将这一组字符串贴在首地址为ch的内存内,这个粘贴的操作是不会收到ch长度限制的,所以实际上这里已经覆盖了未申请的内存
当输出的时候,对于字符串输出,系统也会从ch首地址开始对内存进行遍历,直到找到第一个'\0'(这标志着字符串的结束),并将这些结果全部打印出来,所以其实这中间形成了两次越界,但是程序从语义方面是可以成功执行的
当你创建多个局部变量的时候,越界访问可能会造成对一个变量的修改影响其他变量的内存空间,所以一般写代码的时候还是要避免这种越界.
有帮助望采纳

C语言数组是以\0作为数组结束的标志,如果没有找到\0会一直读取数据,你输入的字符数太多了,或者用for循环实现输出5个字符。

其实电脑开机后物理内存的每个字节中都有值且都是可读写的,从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。