cwh_live_again 2021-09-14 13:53 采纳率: 0%
浏览 88

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

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

img

  • 写回答

3条回答 默认 最新

  • 关注

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

    评论

报告相同问题?

问题事件

  • 创建了问题 9月14日