鱼C论坛

 找回密码
 立即注册
查看: 2988|回复: 10

循环里 i+1的问题

[复制链接]
发表于 2019-9-24 04:39:09 | 显示全部楼层 |阅读模式
1鱼币
大佬们 请问一下 为什么 tab[i+1] 输出的结果为 2 3 4 5 4 ? 最后的4 是怎么来的?
在平时写代码中也会遇到这种情况,请问怎么解决这种问题?  i+1 或 i+2 后超出列表的长度之类的.





#include<stdio.h>
int tab[5]={1,2,3,4,5};
int i;

int main()
{
    for(i=0;i<5;i++){
        //printf("%d ",tab[i]);
        printf("%d ",tab[i+1]);
    }
   
   
    return 0;
}

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-9-24 07:58:06 | 显示全部楼层
本帖最后由 理想小青年 于 2019-9-24 07:59 编辑

输出结果: 2 3 4 5 0
内存数据:01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05 00 00 00 00 00 00 00
这是在我电脑上运行的结果,这个问题是越界后 + 1的字符串是什么,其实tab[5]不算越界,正好在边界,而你的输出结果可能编译器有关,你用的vc6++?
int tab[5],最后tab[5]应该是\x00
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-9-24 10:02:10 | 显示全部楼层
4是数组边界外的内存上随机存储的数值,你可以多做几个循环看看。想避免超出下标的话,可以用sizeof(tab)/sizeof(tab[0])。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-9-24 16:11:40 | 显示全部楼层
理想小青年 发表于 2019-9-24 00:58
输出结果: 2 3 4 5 0
内存数据:01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05 00 00 00 00 00 00  ...

大佬..那如果我是写一个井字棋判定输赢的代码
例如  for(i=0;i<3;i++){
          for(j=0;j<3;j++){
             if( array[i][j]==array[i+1][j]==array[i+2][j] )
                 printf("win");break;}}

那array[i+2]那里 当i=2时 i+2 不就变成4了吗, 那会不会有什么影响呢? 或者要怎么修改它呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-9-24 16:13:47 | 显示全部楼层
Nxgy 发表于 2019-9-24 03:02
4是数组边界外的内存上随机存储的数值,你可以多做几个循环看看。想避免超出下标的话,可以用sizeof(tab)/s ...

大佬 如果我这个tab规定是静态内存呢?

如果我是写一个井字棋判定输赢的代码
例如  for(i=0;i<3;i++){
          for(j=0;j<3;j++){
             if( array[j]==array[i+1][j]==array[i+2][j] )
                 printf("win");break;}}

那array[i+2]那里 当i=2时 i+2 不就变成4了吗, 那会不会有什么影响呢? 或者要怎么修改它呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-9-24 20:32:13 | 显示全部楼层
打开调试,调试一下就知道了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-9-24 22:07:06 | 显示全部楼层
       明知道下标越界,却任其发生,还询问越界访问到的数值来历?写代码没有节操到这个地步,我也是醉了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-9-24 22:50:55 | 显示全部楼层
jackz007 发表于 2019-9-24 15:07
明知道下标越界,却任其发生,还询问越界访问到的数值来历?写代码没有节操到这个地步,我也是醉了 ...

那我应该如何阻止它i+1 这些越界呢? 有什么好的方法?   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-9-24 23:07:22 | 显示全部楼层
        没有什么好方法,你得清楚自己所操作数组的总容量,杜绝下标越界的事情发生。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-9-24 23:11:53 | 显示全部楼层
qpwoeiruyt 发表于 2019-9-24 22:50
那我应该如何阻止它i+1 这些越界呢? 有什么好的方法?

可以用另一个变量去替换i+1并判断这个变量是否越界,尽量不在语句中出现+1 -1 这种情况,我每次用这种方式去循环排序的时候总是出错,很难受.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-24 12:12:58 | 显示全部楼层
因为数组下标溢出,4是内存里tab[4]之后的随机值吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 22:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表