C语言中字符串输入内存越界问题

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’。
总结:在进行输入操作时需要注意,否则会对其他值进行误覆盖。

猜你喜欢

转载自blog.csdn.net/qq_35109096/article/details/81056540