2013-11-25 73 views
0

这段代码是否真的检查出数组的边界?检查超出C的范围

在这种情况下,限制为0 - 20在2D阵列

int noOfNeighbors(game *g, int row, int column){              
    int aliveCounter = 0; 

    for(int rows=-1; rows<=1; rows++) { 
     for(int cols=-1; cols<=1; cols++) { 

      if((rows || cols)) { 
       if(row+rows < (*g).rows && row+rows >= 0){ 
        if(column+cols < (*g).columns && column+cols >= 0){ 
         if(isAlive(g,row+rows,column+cols)){ 
          aliveCounter++; 
         } 
        } 
       } 
      } 
     } //end cols 
    }//end rows 
    return aliveCounter; 
}//end noOfNeighbors 

typedef struct { 
    char current; 
    char next; 
} cell; 


typedef struct { 
    cell field[MAX_ROWS][MAX_COLUMNS]; 
    int rows; 
    int columns; 
    char aliveChar; 
    char deadChar; 
} game; 

和行和列被设置为20

更新后的代码,现在它支票0-19

+2

我们需要'游戏'类型的声明 –

+1

看起来像'(* g).rows'和'(* g).columns'(有人害怕' - >'运算符?)将是您的上限(20)。 –

+0

在这个代码中仍然没有数组访问... – gongzhitaao

回答

2

此代码是否真实检查数组的边界吗?

。你能告诉我们你不明白的地方吗,我们可以更具体吗?

此外,您可以更改:

(*g).rows 

g->rows 

它更易于阅读。

编辑:我刚刚注意到,问题中的代码已被编辑和修复。所以我想你自己发现了这个问题:在最初的问题中,比较中存在问题(<=而不是<)。

+0

(* g).rows和g->行之间有区别,除了它更容易阅读吗? – uzr

+0

编号' - >'是为了更容易阅读。 –

0

这不是一个答案,但过长的注释:

你呈现的代码有很多问题:我将只针对这些:

正如其他已经在评论和另一个答案中指出:使用g->行代替(* g).rows

在代码段

int noOfNeighbors(game *g, int row, int column){              
    int aliveCounter = 0; 

    for(int rows=-1; rows<=1; rows++) { 
     for(int cols=-1; cols<=1; cols++) { 

      if((rows || cols)) { 
       if(row+rows < (*g).rows && row+rows >= 0){ 

它被写入的方式,最后一行的结果是不确定的。也就是说,内循环,第一个达到1是cols(行仍然是-1),并且在比较中(*g).rows && row+rows >= 0)`(* g).rows尚未初始化。

然后,在该行下面:

    if(column+cols < (*g).columns && column+cols >= 0){ 

出于同样的原因,会有不确定的结果。

基础上提出了什么,有没有办法确切知道何时执行流程将最终得到循环的核心:

     if(isAlive(g,row+rows,column+cols)){ 
         aliveCounter++; 
        } 

建议:第一,你提供与相符的代码段SSCCE,并可能解释确切的意图是什么,以及它未达预期的地方。

+0

我不明白为什么它会是不确定的结果。 (同样,第一个循环中的行等于-1,而不是0)。 –

+0

'(* g).rows'在调用此函数之前可能已在其他位置初始化。 –

+0

@Maxime同意这两个,将修复我的-1错误。关于_如何不确定?_,我没有看到它已经初始化的代码,或者OP已经陈述过的代码。这是一个因素,为什么这个问题很难回答很多。我的回答顺带提到“这不是答案”,只是一个罗嗦的评论 – ryyker