【问题标题】:Segmentation fault in wildcard pattern matching通配符模式匹配中的分段错误
【发布时间】:2016-06-26 19:34:18
【问题描述】:

我在 interviewBit 的通配符模式匹配中遇到分段错误,我寻求帮助,但现在没有得到任何回应。 我正在使用 DP 来解决任务。 请帮我找出segFault的原因 问题链接——https://www.interviewbit.com/problems/regular-expression-match/

这是我在 C++ 中获取 segFault 的解决方案。

int Solution::isMatch(const string &s, const string &p) {

    int n=s.size(),m=p.size();
    bool dp[n+1][m+1];

   for(int i=0;i<=n;i++)for(int j=0;j<=m;j++)dp[i][j]=false;
   dp[0][0]=true;

   for(int j=1;j<=m;j++)
      if(p[j-1]=='*')dp[0][j]=dp[0][j-1];

   for(int i=1;i<=n;i++)
   {
      for(int j=1;j<=m;j++)
      {
         if(s[i-1]==p[j-1] || p[j-1]=='?')dp[i][j]=dp[i-1][j-1];
         else if(p[j-1]=='*')
         {
            int v1=dp[i][j-1],v2=0;// Not Using
            v2=(dp[i-1][j]|dp[i][j-1]);
            dp[i][j]=(v1|v2);
         }
         else dp[i][j]=false;
      }
   } 
   return dp[n][m];
}

【问题讨论】:

  • 好像你在运行时得到它,导致错误的字符串值是什么?
  • bool dp[n+1][m+1]; 这在 C++ 中是不合法的,C++ 中的数组必须使用编译时表达式声明为条目数。改用std::vector,不仅可以使其成为标准C++,而且可以帮助您调试问题,因为vector 有一个at() 函数,如果超出范围(而不是seg 错误)会引发异常。
  • @EmrahIzci 未提供字符串值!
  • @PaulMcKenzie 谢谢,我会尝试使用 Vectors...
  • @SandeepKumar 使用 std::vector&lt;std::vector&lt;bool&gt;&gt; dp(n+1, std::vector&lt;bool&gt;(m+1)); 并将使用 [ ] 的访问替换为 at()(对于字符串和向量)。然后,如果超出范围,将抛出 out_of_range 异常而不是 seg 错误。然后,您只需要查看哪个访问引发了异常并解决问题。使用非标准数组和[ ] 没有这个“调试功能”——只有at() 有这些特点。

标签: c++ string segmentation-fault dynamic-programming


【解决方案1】:

你必须分配动态内存

bool** dp = new bool*[n+1];
for(bool i = 0; i < n+1; ++i)
    dp[i] = new bool[m+1];

由于您不需要对数据进行任何自定义操作,只需一个数组就足够了,不需要向量。

【讨论】:

  • 您所说的“自定义操作”是什么? vector 动态分配内存而无需执行任何循环并像您所做的那样调用new[] 的事实就是它的设计目的。另外,您没有提到 delete[] 以及如何调用它。
  • vector 添加的唯一帮助程序员解决问题的功能是 1) 不必手动管理内存,也许同样重要,2) at() 函数来测试边界访问错误。使用new[] 甚至常规数组(甚至非标准VLA)都没有这个调试功能。而且根据海报的说法,问题似乎是由于矢量解决了,并且可能使用at()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-19
  • 1970-01-01
  • 2013-06-13
  • 2014-02-05
  • 1970-01-01
  • 2016-09-03
相关资源
最近更新 更多