分享

wang_qiao_ying 2010-05-27 04:28:13
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的空间里。


...全文
116 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhai_yi_jia 2010-05-28
  • 打赏
  • 举报
回复
JFJFJF
  • 打赏
  • 举报
回复
楼主想说明内存地址是连续的么?
东莞某某某 2010-05-27
  • 打赏
  • 举报
回复
恭喜 .
liu_siat 2010-05-27
  • 打赏
  • 举报
回复
jfjfjf
renzhewh 2010-05-27
  • 打赏
  • 举报
回复
缓冲区溢出嘛
  • 打赏
  • 举报
回复
周靖峰 2010-05-27
  • 打赏
  • 举报
回复
楼主所描述的现象是一个经典bug,我的C语言老师还专门为我们讲解了原因,果然是一个很有趣的现象啊!
wade_2003 2010-05-27
  • 打赏
  • 举报
回复
我就喜欢你这样学习的,因为自己从来都没注意到这些,加油~
renbin5566 2010-05-27
  • 打赏
  • 举报
回复
接分。。。
nommm 2010-05-27
  • 打赏
  • 举报
回复
同上。
FingerStyle 2010-05-27
  • 打赏
  • 举报
回复
接分。

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧