2015-09-09 20 views
0

我試圖運行下面的代碼,但它給我分割故障: -分段故障使用std ::時填寫

#include <bits/stdc++.h> 
using namespace std; 
#define MAX 1000 
int dp[MAX][MAX]; 

string s1, s2; 

int lcs(int i, int j) 
{ 
    int val; 
    if (i < 0 || j < 0) 
     return 0; 
    else if (dp[i][j] != -1) 
    { 
     return dp[i][j]; 
    } 
    else 
    { 
     val = max(lcs(i-1,j), lcs(i, j-1)); 
     if (s1[i] == s2[j]) 
      val = max(lcs(i-1,j-1) + 1, val); 
    } 
    dp[i][j] = val; 
    return val; 
} 

int main() 
{ 
    int tc; 
    scanf("%d", &tc); 
    while (tc--) 
    { 
     fill(&dp[0][0], &dp[MAX][MAX], 0); 
     cin>>s1; 
     cin>>s2; 
     printf("LCS = %d\n", lcs(s1.size()-1, s2.size()-1)); 
    } 
    return (0); 
} 

現在,它給我分割故障,在printf線在while循環中。但是,如果我註釋填充語句,則不存在分段錯誤。
這可能是什麼原因?

+0

_「這可能是什麼原因?」_未定義的行爲最有可能。無法從您的代碼示例中發現它。 –

+0

爲什麼使用C++字符串,然後使用固定大小的C數組和宏?使用可以是所需大小的矢量,並且不會因大輸入而中斷。 –

+0

也嚴重:[爲什麼我不應該#include ?](http://stackoverflow.com/questions/31816095/why-should-i-not-include-bits-stdc-h)! –

回答

8
&dp[MAX][MAX] 

這引用了過去結束數組的過去末尾指針。你想最後一個數組的過去最末端的指針,而不是:

&dp[MAX-1][MAX] 

否則它會重複過去最高端磁盤陣列,造成段錯誤。