分享
int main()
{
char mychar = 'a';
char ch[3]={0};
int i = 1;
printf("Input the char:");
scanf("%s",ch);
for(i = 0;i < 3;i++)
printf("%c ",ch[i]);
printf("mychar = %c\n",mychar);
return 0;
}
这里变量mychar和数组ch都是在栈内申请空间,且栈空间的申请次序是从大地址开始
-----------------------------------------
0X0012FF78
0X0012FF79
0X0012FF7A
------------------------------------
这三个字节地址分别存放ch数组的三个成员
0X0012FF7B(系统字节自动对齐留出了一位)
------------------------------------
0X0012FF7C
Mychar
--------------------------------------
运行程序输入eee然后敲回车键:
运行结果为:
e e e mychar = a
看似结果正常,其实这里已经出现了错误,假如运行程序输入eeee然后敲回车键:
运行结果为:
e e e mychar = (空)为什么呢?因为scanf在用%s输入时默认的字符产结尾是0。因为在输入3个‘e‘时,那个空字符放到了系统为了对齐而空出的一个字节里0X0012FF7B。所以并没有影响到mychar的输出。当输入4个’e‘时,第4个’e‘放到了0X0012FF7B里,所以空字符填充到了mychar的空间里。
运行程序输入eeeee然后敲回车键:
运行结果为:
e e e mychar = e。输入的第5个‘e‘字符放到了mychar的空间里。