美文网首页
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语言中输入字符数超过字符数组内存空间会怎样?

    0.问题描述 先看一段简短的代码: 问题:当输入字符个数超出str1的内存空间时,多余的字符部分将如何处理? 1....

  • C语言- 字符、字符数组

    字符数组和字符串 C语言中没有字符串这种数据类型,C语言中通过char型数组来替代字符串的功能。C语言中的字符串一...

  • 2018-05-13

    C语言:c语言中没有字符串类型,也没有字符串变量,字符串是放在字符型数组中的。 C语言数变量类型:整型、浮点型、v...

  • C语言笔记(二)--- 数组、函数

    七、数组 在C语言中,数组属于构造数据类型。数组根据元素的类型不同,数组又可以分为 数值数组 、字符数组 、指针数...

  • C-字符串

    字符串 在 C 语言中,字符串实际上是使用 null 字符 '\0' 终止的一维字符数组。C 编译器会在初始化数组...

  • C入门7:字符串入门

    1. 字符串是什么? 存放字符(char)的数组称为字符数组。在C语言中,使用NULL字符('\0')终止的一维字...

  • C语言复习之字符串

    C语言中没有String这种类型。其实字符串就是字符序列,由多个字符组成,所以在C语言中,我们可以用字符数组来存储...

  • C语言字符串

    在c语言中,字符串是用字符数组来存储的(并不像c++或者java等语言中有单独的string类型), 存放时在字符...

  • C 和 Java 中字符串和字符数组的对比

    1. C 和 Java 中字符串和字符数组的对比 实现原理 在 C 语言中,字符串和字符数组本质上都是一块连续的内...

  • C语言中字符数组的初始化与赋值

    1.字符数组初始化 在C语言中,字符串是当做字符数组来处理的;所以字符串有两种声明方式,一种是字符数组,一种是字符...

网友评论

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

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