为什么这里有SIGSEGV?

时间:2017-07-05 11:23:24

标签: c++ segmentation-fault

我正在尝试在http://ideone.com/YisrPH处运行此代码。

我在这个函数中得到一个SIGSEGV -

int minDistance(string A, string B) {
    cout << "HEUI";
    int m = A.length();
    int n = B.length();
    cout << "H";
    int i, j;
    cout << "H";
    // int dist[m+1][n+1];
    // for(i=0;i<=m;i++)
    //     for(j=0;j<=n;j++)
    //         dist[i][j] = 0;
    cout << "H";
    vector<vector<int>> d(m+1, vector<int>(n+1,0));
    cout << "H";
    for(i=0;i<=m;i++) {
        for(j=0;j<=n;j++) {
            if(i==0) d[i][j] = j;
            if(j==0) d[i][j] = i;
            else if(A[i-1]==B[j-1]) d[i][j] = d[i-1][j-1];
            else d[i][j] = 1 + min(d[i-1][j], d[i][j-1], d[i-1][j-1]);
            // cout << dist[i][j] << i << j << endl;
        }
    }
    // cout << dist[m][n];
    return d[m][n];
}

正如您将注意到的,我正在使用向量来构建2D数组。如果我替换它以使用普通的2D数组,它会运行,但结果有时是正确的,有时是垃圾。

1 个答案:

答案 0 :(得分:3)

您正在访问array.Consider i=0j=1

的范围之外
 for(i=0;i<=m;i++) 
 {
    for(j=0;j<=n;j++) 
    {
        if(i==0) 
            d[i][j] = j;
        if(j==0) 
             d[i][j] = i;
        else if(A[i-1]==B[j-1])    //A[i-1]=A[0-1]=A[-1]
             d[i][j] = d[i-1][j-1];

你可以试试这个

   if(i==0 || j==0) 
            d[i][j] = (i==0?j:i);
   else if(A[i-1]==B[j-1])
     ...

或者@mch在评论中指出的更好

    if(i==0 || j==0) 
            d[i][j] = i+j;
   else if(A[i-1]==B[j-1])
      ...