2013-11-25 71 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