2015-06-22 38 views
1

這是我的代碼problem在我的C程序中獲取SIGSEGV錯誤

我使用了一種動態編程方法,我的答案即將出現是正確的。但是我得到一個SIGSEGV運行時錯誤,可能是因爲數組索引,我無法弄清楚如何以及在哪裏?

如果你能弄清楚問題出在哪裏,請告訴我。

#include <stdio.h> 
#include <stdlib.h> 
#include <memory.h> 

int dynp(int i, int j); 

int v[] = {-1, 0, 1, 0}; 
int h[] = {0, 1, 0, -1}; 
int ROW, COL; 

#define INF 1000000 

int minOfTwo(int one, int two){ 
    if (one<two) { 
     return one; 
    }else{ 
     return two; 
    } 
} 

int matrix[190][190]; 
int dp[190][190]; 

int main(int argc, const char * argv[]) { 

    int t; 

    scanf("%d", &t); 

    int i,j; 
    char s[190]; 
    while (t--) { 

     scanf("%d %d", &ROW, &COL); 

     for (i = 0; i<ROW; i++) { 
      scanf("%s", s); 
      for (j = 0; j<COL; j++) { 
       matrix[i][j] = s[j] - 48; 
       dp[i][j] = INF; 
      } 
     } 


     for (i = 0; i<ROW; i++) { 
      for (j = 0; j<COL; j++) { 
       if (dp[i][j] == INF) { 
        if (matrix[i][j] == 1) { 
         dp[i][j] = 0; 
        } 
        else{ 
         dp[i][j] = dynp(i, j); 
        } 
       } 
      } 
     } 

     for (i = 0; i<ROW; i++) { 
      for (j = 0; j<COL; j++) { 
       printf("%d ", dp[i][j]); 
      } 
      printf("\n"); 
     } 
    } 

    return 0; 
} 

int dynp(int i, int j) 
{ 
    if (dp[i][j] != INF) { 
     return dp[i][j]; 
    } 
    else{ 
     if (matrix[i][j] == 1) { 

      dp[i][j] = 0; 
      return dp[i][j]; 
     } 
     else{ 
      int k; 
      for (k = 0; k<4; k++) { 

       int newi = i + v[k], newj = j + h[k]; 

       if (newi < ROW && newj < COL && newi>=0 && newj>=0) { 
        dp[i][j] = minOfTwo(dp[i][j], 1 + dynp(newi, newj)); 
       } 
      } 
      return dp[i][j]; 
     } 
    } 
} 
+0

'的scanf( 「%S」,S);' - >'的scanf( 「%189S」,S);' –

+0

檢查返回值'scanf(「%d%d」' –

+0

這是遞歸的。你確定遞歸會確定性地結束? – donjuedo

回答

1

在第一次看,在你的代碼,

scanf("%s", s); 
      for (j = 0; j<COL; j++) { 
       matrix[i][j] = s[j] - 48; 

看起來有問題的。由於s的長度小於COLs的值,因爲它是一個未明確初始化的自動局部變量,您將訪問已分配但未初始化的內存位置。

你應該改變循環條件類似

scanf("%189s", s);      //to avoid overflow 
    int len = strlen(s); 
      for (j = 0; (j<COL) && (j < len); j++, len--) { 
       matrix[i][j] = s[j] - 48; 
+0

它將作爲輸入指定的COL。我認爲dp [] []中存在問題 – user3072362