2015-09-09 2 views
0

Я пытаюсь запустить следующий код, но он дает мне ошибку сегментации: -ошибка сегментации при использовании зОго :: заполнить

#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. Однако, если я прокомментирую инструкцию fill, то нет ошибки сегментации.
Что может быть причиной этого?

+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] 

в противном случае он будет перебирать в прошлом-окончание массив, вызывая Segfault.

Смежные вопросы