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