美文网首页
C语言中输入字符数超过字符数组内存空间会怎样?

C语言中输入字符数超过字符数组内存空间会怎样?

作者: RavenX | 来源:发表于2018-06-18 22:35 被阅读0次

    0.问题描述

    先看一段简短的代码:

    char str1[3];
    char str2[3];
    scanf("%s",str1);
    

    问题:当输入字符个数超出str1的内存空间时,多余的字符部分将如何处理?

    1.问题解答

    下面为本次验证代码:

    #include<stdio.h>
    int main(void)
    {
        char str1[] = "hello";
        char str2[2]="h";
        printf("address:str1=%x\n",str1);
        printf("address:str2=%x\n",str2);
        printf("value:str1=%s\n",str1);
        printf("value:str2=%s\n",str2); 
        //输入
        scanf("%s",str2);
        printf("address:str1=%x\n",str1);
        printf("address:str2=%x\n",str2);
        printf("value:str1=%s\n",str1);
        printf("value:str2=%s\n",str2);  
        return 0;
    }
    
    

    先贴上结果,再作分析:

    image.png

    首先,我们打印了str1str2地址,在C语言中一个字符占1个字节,因为str2为大小为2的字符数组,所以str1str2的内存相差两个字节,接着打印了str1str2字符串,可以看到分别为helloh,之后str2进行控制台输入共输入9个a,则有9个字节+1个结尾字符(一个字符串以'\0'结尾)共10个字节,显然str2数组仅有的2个字节空间是不够用的,所以剩下的7个a+1个结尾字符顺延到后面的地址空间,而后面的地址空间是str1,所以str1的值被覆盖。
    Q:为什么打印str2不是只打印内存空间中的2个字节?
    A: 因为C语言打印字符串时,是以'\0'为结尾,所以打印时会一直向下扫描,直到遇到'\0'。
    总结:在进行输入操作时需要注意,否则会对其他值进行误覆盖。

    相关文章

      网友评论

          本文标题:C语言中输入字符数超过字符数组内存空间会怎样?

          本文链接:https://www.haomeiwen.com/subject/celoeftx.html