搜索
查看: 2370|回复: 5
打印 上一主题 下一主题

新手问个小问题

[复制链接]
跳转到指定楼层
楼主
发表于 2013-3-2 22:30:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
main()
{int a[10],i;
        for (i=0;i<10;)
    {
                a[i++]=i;
        printf ("a[%d]=%d",i,a[i]);
    }
    printf ("\n");
    for (i=0;i<10;i++)
    printf ("a[%d]=%d",i,a[i]);
    return 0;
}
第一次输出 的是随机数。
第二次没有重新赋值,输出就正确了。
怎么回事?????????????????????????
沙发
发表于 2013-3-2 22:56:46 | 只看该作者
是程序中你定义的数组溢出的原因。a[10]定义数组元素只有a[0]~a[9]而程序中i 的值确是却是从0~10多出两个值所出打印出的结果后两位是随机数。
板凳
发表于 2013-3-2 22:59:53 | 只看该作者
如果想让结果正确需要把程序调整一下;把 i  改成 i <8 结果就正确了。如果想多输出几个结果则把数组元素定义的多点就行了
地板
发表于 2013-3-2 23:29:43 | 只看该作者
本帖最后由 rosynirvana 于 2013-3-2 23:46 编辑
1984777527 发表于 2013-3-2 22:56
是程序中你定义的数组溢出的原因。a[10]定义数组元素只有a[0]~a[9]而程序中i 的值确是却是从0~10多出两个 ...

lz这个是打印1-10
5#
发表于 2013-3-2 23:44:33 | 只看该作者
  1. for (i=0;i<10;)
  2.     {
  3.         a[i++]=i;
  4.         printf ("a[%d]=%d",i,a[i]);
  5.     }
复制代码
这一段代码里面
第一次循环
i = 0,i < 10 进入循环体
a[0] = 0
i++ -> 产生side effect, i = i+1 = 1
下面打印的就是a[1]的值
这时候a[1]还没有被赋值,是个内存中随机的垃圾值

直到最后一次循环
a[9] = 9
i = i + 1 = 10
然后要求打印a[10],数组越界了,然后这个位置恰好可以访问,于是就打印出了一个垃圾值

也就是说,前9次循环,都是给a赋值,然后打印还没赋值的a[i+1]
最后一次打印了越界地址的垃圾值
6#
发表于 2013-3-3 00:01:48 | 只看该作者
不好意思,我误人子弟了。我也是新手
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表