qpwoeiruyt 发表于 2019-9-24 04:39:09

循环里 i+1的问题

大佬们 请问一下 为什么 tab 输出的结果为 2 3 4 5 4 ? 最后的4 是怎么来的?
在平时写代码中也会遇到这种情况,请问怎么解决这种问题?i+1 或 i+2 后超出列表的长度之类的.





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

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

理想小青年 发表于 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不算越界,正好在边界,而你的输出结果可能编译器有关,你用的vc6++?
int tab,最后tab应该是\x00{:10_256:}

Nxgy 发表于 2019-9-24 10:02:10

4是数组边界外的内存上随机存储的数值,你可以多做几个循环看看。想避免超出下标的话,可以用sizeof(tab)/sizeof(tab)。

qpwoeiruyt 发表于 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==array==array )
               printf("win");break;}}

那array那里 当i=2时 i+2 不就变成4了吗, 那会不会有什么影响呢? 或者要怎么修改它呢?

qpwoeiruyt 发表于 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==array==array )
               printf("win");break;}}

那array那里 当i=2时 i+2 不就变成4了吗, 那会不会有什么影响呢? 或者要怎么修改它呢?

lh1996 发表于 2019-9-24 20:32:13

打开调试,调试一下就知道了{:5_91:}

jackz007 发表于 2019-9-24 22:07:06

       明知道下标越界,却任其发生,还询问越界访问到的数值来历?写代码没有节操到这个地步,我也是醉了!

qpwoeiruyt 发表于 2019-9-24 22:50:55

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

那我应该如何阻止它i+1 这些越界呢? 有什么好的方法?   

jackz007 发表于 2019-9-24 23:07:22

      没有什么好方法,你得清楚自己所操作数组的总容量,杜绝下标越界的事情发生。

来学习共进步 发表于 2019-9-24 23:11:53

qpwoeiruyt 发表于 2019-9-24 22:50
那我应该如何阻止它i+1 这些越界呢? 有什么好的方法?

可以用另一个变量去替换i+1并判断这个变量是否越界,尽量不在语句中出现+1 -1 这种情况,我每次用这种方式去循环排序的时候总是出错,很难受.

__墨鱼卷__ 发表于 2020-3-24 12:12:58

因为数组下标溢出,4是内存里tab之后的随机值吧
页: [1]
查看完整版本: 循环里 i+1的问题