【问题标题】:Segmentation fault when using std::fill使用 std::fill 时出现分段错误
【发布时间】:2015-09-10 01:37:10
【问题描述】:

我正在尝试运行以下代码,但它给了我分段错误:-

#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);
}

现在,它在 while 循环中的 printf 行给了我一个分段错误。但是,如果我将填充语句注释掉,则不会出现分段错误。
这可能是什么原因?

【问题讨论】:

  • “这可能是什么原因?” 很可能是未定义的行为。无法从您的代码示例中发现它。
  • 为什么使用 C++ 字符串,然后使用固定大小的 C 数组和宏?使用可以是所需大小且不会因大输入而中断的向量。
  • 感谢您的建议,但我主要只在速度很重要的编程比赛中使用 bits/stdc++.h,而不是在实际的编程项目中。
  • ...&amp;dp[MAX][MAX] 不是比数组末尾的一个更远吗?是不是指向过去数组的结束指针,而不是最后一个数组的结束指针?

标签: c++ segmentation-fault


【解决方案1】:
&dp[MAX][MAX]

这引用了结束数组的结束指针。你想要最后一个数组的结束指针,而不是:

&dp[MAX-1][MAX]

否则它将遍历过去的数组,导致段错误。

【讨论】:

    猜你喜欢
    • 2020-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-25
    • 1970-01-01
    • 1970-01-01
    • 2020-01-21
    • 1970-01-01
    相关资源
    最近更新 更多